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

<% @address_list.each do |al| %> <% end %>
id address latitude longitude
<%= al.id %> <%= al.address %> <%= al.latitude %> <%= al.longitude %>

これで登録した住所一覧が表示されるようになるはずです。

起動して


$ 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を確認してみると

Addressを登録した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

鹿児島県の出水市という所に住んでいまして、インターネット周辺で色々活動して行きたいと思ってるところです。 Webサイト作ったり、サーバ設定したり、プログラムしたりしている、釣りと木工好きなMacユーザです。 今はデータサイエンスに興味を持って競馬AI予想を頑張ってます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください