блок def в грабли - PullRequest
       8

блок def в грабли

39 голосов
/ 04 сентября 2011

Я получил undefined local variable or method 'address_geo' for main:Object со следующей задачей рейка.В чем проблема?

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? && !@spot.address.blank?
      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

Ответы [ 2 ]

97 голосов
/ 04 сентября 2011

Вы определяете метод внутри задачи 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? && !@spot.address.blank?
      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
22 голосов
/ 31 мая 2017

Осторожно: методы, определенные в rake-файлах, в конечном итоге определяются в глобальном пространстве имен.

Я бы предложил извлечь методы в модуль или класс.Это связано с тем, что методы, определенные в rake-файлах, в конечном итоге определяются в глобальном пространстве имен .то есть они могут быть вызваны из любого места, а не только из этого файла rake (даже если он находится в пространстве имен!).

Это также означает, что если у вас есть два метода с одинаковым именем в двух разных рейк-задачах, один из них будет перезаписан без вашего ведома.Очень смертельно.

Отличное объяснение доступно здесь: https://kevinjalbert.com/defined_methods-in-rake-tasks-you-re-gonna-have-a-bad-time/

...