Rails アプリにGoogleMap APIを導入する
はじめに
投稿画面で、ユーザから入力された地名を、GoogleMap上に反映させるための機能実装をまとめます。
実装方法
1.ライブラリをインストール。
以下のライブラリをGemfileに追記します。
gem 'gmaps4rails'
gem 'geocoder'
そして、installします。
$ bundle install
2.カラムの追加
次に、すでに存在しているpostsテーブルにカラムを追加していきます。
class AddAddressToPosts < ActiveRecord::Migration[5.2]
def change
add_column :posts, :address, :string
add_column :posts, :latitude, :float
add_column :posts, :longitude, :float
end
end
address(住所), latitude(緯度), longitude(経度)カラムを追加します。
先ほど、インストールしたライブラリが、このaddressに格納された情報から緯度、経度を自動で計算をし、それぞれのカラムに格納してくれます。
マイグレーションファイルをDBに反映させるのを忘れずに
$ rails db:migrate
3.Mapの表示部分を作る
GoogleMapを表示させたい部分に以下のコードを追加します。
<h3>釣行場所</h3>
<div class="map">
<div id="map">
</div>
</div>
<div type="text/javascript">
<script>
function initMap(){
let map = new google.maps.Map(document.getElementById('map'), {
center: {lat: <%= @post.latitude %>, lng: <%= @post.longitude %> },
zoom: 15
});
}
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=<%= ENV['API_KEY'] %>&callback=initMap" async defer></script>
このままだと、表示される地図が大きすぎるので、任意のサイズに調整します。
#map {
height: 300px;
width: 400px;
}
4.ユーザが地名を入力するフォームを作る
ユーザがpostsを投稿するformに以下のように追加をします。
<%= form_with(model: @post, local: true) do |f| %>
・
・
<div class="form-group">
<%= f.label :address, '場所' %>
<%= f.text_field :address, class: 'form-control' %>
</div>
・
・
<%= f.submit '投稿する', class: 'btn btn-primary btn-block' %>
5. 最後に表示を確認
このように、投稿フォームで入力された場所をマップが表示していれば成功です。
メモ
function initMap(){
let map = new google.maps.Map(document.getElementById('map'), {
center: {lat: <%= @post.latitude %>, lng: <%= @post.longitude %> },
zoom: 15
});
}
任意のviewファイルに以下のコードを記述します。
私の場合は、釣れた場所をGoogleMapで表示したかったため、<h3>
タグに釣行場所が書かれています。
rb:index.html.erb
<h3>釣行場所</h3>
<div class="map">
<div id="map">
</div>
</div>
<%= javascript_include_tag 'map.js' %>
<script src="https://maps.googleapis.com/maps/api/js?key=<%= ENV['API_KEY'] %>&callback=initMap" async defer></script>
</div>
<div id="map"></div>
の部分にGoogleMapが表示されます。
また、<%= ENV['API_KEY'] %>
の部分は環境変数を設定して埋め込んでおり、
.env
ファイルに以下の記述を追加します。
API_KEY='*********************'
RailsでJavaScriptファイルを読み込む方法
任意のviewファイルに以下のコードを追加します。
・
・
<%= javascript_include_tag 'sample.js' %>
・
・
次にasseets.rbに以下のコードを記述します。
Rails.application.config.assets.precompile += %w( sample.js )
これで、app/assets/javascripts/
に置いてある、任意のjsファイルが読み込まれて、view上でJavaScriptが使えるようになります。
おわりに
自分のアプリケーションにGoogleMapを搭載するのに、色々と試行錯誤しましたが、意外とシンプルなコードで実装することができました。
GoogleMapを使った機能を実装する際には、GoogleのAPIキーを取得する必要があるのですが、その辺りの詳細はまたの機会にまとめます。
Discussion