geocoder + Sinatra (+ ActiveRecord) で位置情報を使ってみる その2
geocoder + Sinatra (+ ActiveRecord) で位置情報を使ってみるの続きです。
懸案だった住所を入力したら緯度経度を自動で入力してくれる機能を追加します。
ルートの追加
geaapp.rbに以下を追加して、住所の入力・表示をするルートを作り、
class App < Sinatra::Base
(省略)
+ get '/address' do
+ @address_list = Location.all
+ erb :address
+ end
end
Viewの追加
address.erbというファイルを作り、以下を追加しました。
$ emacs views/address.erb
id
address
latitude
longitude
<% @address_list.each do |al| %>
<% end %>
これで登録した住所一覧が表示されるようになるはずです。
起動して
$ bundle exec rackup -p 8887
ブラウザで確認は
http://localhost:8887/address
次はDBに登録部分
viewで作ったformからデータベースに登録する部分を作ります。
これでformを作ってるので、post '/create'を追加します。
params[:address]の中に入力した住所が入っているので登録します。
class App < Sinatra::Base
(省略)
+ post '/create' do
+ Location.create( {:address => params[:address]} )
+ redirect :address
+ end
end
DBを確認してみると
住所を入力したら、緯度経度が自動で入力されました。
↓このモデルの記述だけで、自動で登録してくれるんでしょうね〜。
class Location < ActiveRecord::Base
geocoded_by :address
after_validation :geocode, if: :address_changed?
end
凄いな、geocoder
ついでに
この緯度経度情報から地図を表示してみます。
住所一覧の地図を表示ボタンをクリックして表示するようにしました。
こんな感じでformを作ってるので、post '/map'を追加します。
そしてDBからデータを持ってきて、Viewに渡します。
class App < Sinatra::Base
(省略)
post '/map' do
@listing = Location.find(params[:address_id])
erb :index
end
end