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
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
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/