web-dev-qa-db-fra.com

bloc def dans la tâche de râteau

J'ai eu undefined local variable or method 'address_geo' for main:Object avec la tâche de râteau suivante. Quel est le problème avec ça?

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
41
Victor

Vous définissez la méthode dans la tâche de râteau. Pour obtenir la fonction, vous devez définir en dehors de la tâche de râteau (en dehors du bloc de tâches). Essaye ça:

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
98
rubyprince

Attention: les méthodes définies dans les fichiers rake finissent par être définies sur l'espace de noms global.

Je proposerais d'extraire les méthodes dans un module ou une classe. En effet, les méthodes définies dans les fichiers rake finissent par être définies sur l'espace de noms global . c'est-à-dire qu'ils peuvent ensuite être appelés de n'importe où, pas seulement dans ce fichier rake (même s'il est à espace de noms!).

Cela signifie également que si vous avez deux méthodes portant le même nom dans deux tâches de râteau différentes, l'une d'entre elles sera remplacée à votre insu. Très mortel.

Une grande explication est disponible ici: https://kevinjalbert.com/defined_methods-in-rake-tasks-you-re-gonna-have-a-bad-time/

25
Hula_Zell