Mise à jour de coordonnées sur le changement d'adresse modèle en utilisant Google-Maps-Pour-Rails
-
24-10-2019 - |
Question
Je l'ai remarqué avec Google Maps pour gemmes Rails qui fonctionne par ailleurs parfaitement que lorsque je change une adresse dans le champ de modèle, les coordonnées ne sont pas automatiquement mis à jour, même si le champ d'adresse est mis à jour et enregistré. J'ai créé une méthode de before_save qui appelle géocodage.
before_save :update_location_coordinates # in model being mapped
protected
def update_location_coordinates
place = Gmaps4rails.geocode(gmaps4rails_address).first
self.longitude, self.latitude = place[:lng], place[:lat] unless place.empty?
rescue
nil
end
Cela fonctionne, mais je me demande s'il est nécessaire, car il semble que quelque chose qui devrait être automatique dans la pierre précieuse. Am quelque chose que je manque?
Merci ...
PS géocodage retourne un tableau, donc je viens de prendre la première estimation (meilleure)
La solution
Le rafraîchissement des coordonnées est un processus délicat en raison de la méthode de gmaps4rails_address
. Il est souple si facile à utiliser, mais la contrepartie est qu'il est impossible de savoir si l'adresse a vraiment changé.
C'est pourquoi je donne deux possibilités différentes codeurs pour répondre à leurs besoins:
- Si vous ne se soucient pas de la performance, vous pouvez actualiser les coordonnées chaque fois que le modèle est enregistré (et même si l'adresse n'a pas changé). Voir ici: https://github.com/apneadiving/Google-Maps-for-Rails / wiki / Modèle-personnalisation .
Changement :check_process
à false
:
acts_as_gmappable :check_process => false
2. Si vous voulez avoir un contrôle total sur le processus, définissez le booléen gmaps
à false
chaque fois que vous voulez les coordonnées à jour. Il pourrait être un champ caché dans votre formulaire ou un crochet dans votre modèle de vérifier les champs nécessaires.
Autres conseils
Ceci est un moyen économique pour résoudre le problème:
- ajouter une colonne au modèle - par exemple last_g4r_address
-
ajouter une fonction before_validation:
def check_g4r_address self.gmaps = false si last_g4r_address! = gmaps4rails_address self.last_g4r_address = gmaps4rails_address fin
De cette façon, le géocodage est mis à jour que si l'adresse a changé.