bloc def dans la tâche de ratissage

J’ai undefined local variable or method 'address_geo' for main:Object avec la tâche de rake 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? && !@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 

Vous définissez la méthode dans la tâche de rake. Pour obtenir la fonction, vous devez définir en dehors de la tâche de rake (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? && !@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 

Attention: les méthodes définies dans les fichiers rake sont définies sur l’espace de noms global.

Je proposerais d’extraire les méthodes dans un module ou une classe. Cela est dû au fait que les méthodes définies dans les fichiers rake sont définies sur l’espace de noms global . c’est-à-dire qu’ils peuvent être appelés de n’importe où, pas seulement dans ce fichier rake (même s’il est placé sous un nom!).

Cela signifie également que si vous avez deux méthodes portant le même nom dans deux tâches de rake différentes, l’une d’entre elles sera écrasée sans que vous le sachiez. Très mortel

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