Def block в задаче rake
Я получил undefined local variable or method 'address_geo' for main:Object
со следующей командой rake. В чем проблема?
include Geokit::Geocoders
namespace :geocode do
desc "Geocode to get latitude, longitude and address"
task :all => :environment do
@spot = Spot.find(:first)
if @spot.latitude.blank? && [email protected]?
puts address_geo
end
def address_geo
arr = []
arr << address if @spot.address
arr << city if @spot.city
arr << country if @spot.country
arr.reject{|y|y==""}.join(", ")
end
end
end
Ответы
Ответ 1
Вы определяете метод внутри задачи rake. Для получения функции вы должны определить вне задачи rake (вне блока задач). Попробуйте следующее:
include Geokit::Geocoders
namespace :geocode do
desc "Geocode to get latitude, longitude and address"
task :all => :environment do
@spot = Spot.find(:first)
if @spot.latitude.blank? && [email protected]?
puts address_geo
end
end
def address_geo
arr = []
arr << address if @spot.address
arr << city if @spot.city
arr << country if @spot.country
arr.reject{|y|y==""}.join(", ")
end
end
Ответ 2
Осторожно: методы, определенные в файлах rake, в конечном итоге определены в глобальном пространстве имен.
Я бы предложил извлечь методы в модуль или класс. Это объясняется тем, что методы, определенные в файлах rake, определены в глобальном пространстве имен. то есть они могут быть вызваны из любого места, а не только внутри этого файла рейка (даже если это пространство имен!).
Это также означает, что если у вас есть два метода с одним и тем же именем в двух разных задачах грабли, один из них будет перезаписан без вашего ведома. Очень смертельно.
Большое объяснение доступно здесь: https://kevinjalbert.com/defined_methods-in-rake-tasks-you-re-gonna-have-a-bad-time/