Подтвердить что ты не робот

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
4b9b3361

Ответ 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/