Aggiornamento coordinate su come cambiare l'indirizzo del modello utilizzando Google Maps-Per-Rails
-
24-10-2019 - |
Domanda
Ho notato con le Google Maps per rotaie gemme che altrimenti funziona perfettamente che quando cambio un indirizzo nel campo del modello le coordinate non vengono aggiornate automaticamente, anche se il campo indirizzo sia aggiornato e salvato. Ho creato un metodo che chiama before_save geocodifica.
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
Questo funziona, ma mi chiedo se è necessario in quanto sembra che qualcosa che dovrebbe essere automatico nel gioiello. Mi sto perdendo qualcosa?
grazie ...
PS geocode restituisce un array così ho preso il primo (migliore) congettura
Soluzione
L'aggiornamento delle coordinate è un processo difficile a causa del metodo gmaps4rails_address
. È flessibile così facile da usare, ma la controparte è che non è possibile sapere se l'indirizzo davvero cambiato.
Ecco perché io do codificatori due diverse opportunità per soddisfare le loro esigenze:
- Se non si cura di prestazioni, è possibile aggiornare le coordinate ogni volta che il modello viene salvato (e quindi anche se l'indirizzo non è cambiato). Vedi qui: https://github.com/apneadiving/Google-Maps-for-Rails / wiki / Modello-personalizzazione .
Cambia :check_process
a false
:
acts_as_gmappable :check_process => false
2. Se si vuole avere il pieno controllo del processo, impostare il booleano gmaps
per false
quando vuoi le coordinate da aggiornare. Potrebbe essere un campo nascosto nel modulo o di un gancio nel modello controllando i campi necessari.
Altri suggerimenti
Questo è un modo economico per risolvere il problema:
- aggiungere una colonna al modello - ad esempio last_g4r_address
-
aggiungere una funzione before_validation:
def check_g4r_address self.gmaps = false se last_g4r_address! = gmaps4rails_address self.last_g4r_address = gmaps4rails_address end
In questo modo il geocoding viene aggiornato solo se l'indirizzo è cambiato.