Search code examples
ruby-on-railsrubymethodsrake

def block in rake task


I got undefined local variable or method 'address_geo' for main:Object with the following rake task. What's the problem with it?

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

Solution

  • Update: Gotcha

    This potentially adds the method to global scope and will conflict with any other method with the same name. Look at @Hula_Zell's answer https://stackoverflow.com/a/44294243/584440 for a better way.

    Original answer

    You are defining the method inside the rake task. For getting the function, you should define outside the rake task (outside the task block). Try this:

    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