我收到了带有以下rake任务的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? && [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

最佳答案

更新:Gotcha
这可能会将方法添加到全局范围,并且将与任何其他具有相同名称的方法发生冲突。查看@Hula_Zell的答案https://stackoverflow.com/a/44294243/584440,以获得更好的方法。
原始答案
您正在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

10-01 22:33