I have this in my shop.rb
:
def geocode_address
if !address_geo.blank?
geo=Geokit::Geocoders::MultiGeocoder.geocode(address_geo)
errors.add(:address, "Could not Geocode address") if !geo.success
self.lat, self.lng = geo.lat,geo.lng if geo.success
end
end
# Checks whether this object has been geocoded or not. Returns the truth
def geocoded?
lat? && lng?
end
And in my shops_controller.rb
:
def update
@shop = Shop.find(params[:id])
if @shop.update_attributes(params[:shop])
flash[:notice] = "Successfully saved."
redirect_to shop_path(@shop, :type => @shop.shop_type)
else
render :action => :edit
end
end
Now when the user first creates the entry, the address is geocoded, with latitude and longitude saved to the database.
But when the user updates the address, the latitude and longitude will not be geocoded anymore, and thus still using the old latitude and longitude which is the first save.
How do I write to have Rails re-geocode everytime an entry is update?
I can't depend on just the address because there is a bug in geokit that when I try to show multiple maps based on address, only the last one is shown.
I'm using geokit, Gmaps, Google Maps...
Thanks.
Better to use Geocoder Gem https://github.com/alexreisner/geocoder
Actually in your model shop.rb you will need to to add the following to ensure that the longitude and latitude fields get updated in your shop table every time a user updates the address in your view.
Gemfile
You should add two fields to the Shop table, longitude and latitude, make sure they are both floats, make the migration if you have not done this already.
Assuming that
address
is a field and it exists in your shop table, and assuming thatlocation.html.erb
is a view in your shop and in that view you have something like this<%= f.text_field :address, placeholder: "Your Shop's Address", class: "form-control", required: true, id: "shopaddress" %>
I also assuming that, when you created your Shop model you added the property
active:boolean
anduser:references
to know is a shop is active or not, and know to which user does the shop belong to. So one user has many shops.The ID shopaddress, i am including here just in case you want to use Geocomplete gem with Google Maps API with the Places Library. But you do not need it there.
In shop.rb
Of course in your controller you will want to ensure that whoever is updating the address is authorized first and then run the methods. So instead of having to repeat your self. You'll probably want to create something like this in your shop controller.
In shops_controller.rb
If the user changes their address can't you essentially handle it the same way as a new address? You basically have 2 new addresses you just need to link the newly created address with the user's account and everything should work.
I put this in my model:
The new syntax to perform validation before a specific action is:
or if you have more than one action,
This will ensure that before validation and saving to the database is done, your method (
geocode_address
) runs first.