現在railsでgoogle map APIを使用し、いきたい場所の登録→登録したものを一覧表示するアプリを作っています。
その中の一覧表示に関してうまく行かないので質問させていただきます。
一覧表示の内容としては、
場所の名前や場所と一緒にgoogle mapによる表示がされるように作っています。
それがeach文により複数表示されていくといったイメージです。
登録したものをeach文により表示させるというものはうまくできたのですが、今回作りたいのは行ったことがある場所を除いた全ての登録を一覧表示させるというものです。
html.erb
<% @places.each_with_index do |place,i| %> <% unless current_user.checkcomp?(place) %> <tr> <td><%= place.id %></td> <td><%= place.name %></td> <td><%= place.latitude %></td> <td><%= place.longitude %></td> <td><%= place.address %></td> <td><%= place.price_level %></td> <td><%= place.rating %></td> <td><%= link_to ( place ), :title => "show" do %> <span class="glyphicon glyphicon-stats"></span> <% end %></td> <td><%= link_to "削除", place, method: :delete, data: { confirm: "本当に削除しますか?" } %></td> <td> <% if current_user.checkfav?(place) %> <%= form_with(url: create_favorite_path(id: place.id), local: true, method: :delete) do |f| %> <%= hidden_field_tag :place_id, place.id %> <%= f.submit '登録解除', class: 'btn btn-danger' %> <% end %> <% else %> <%= form_with(url: create_favorite_path(id: place.id), local: true) do |f| %> <%= hidden_field_tag :place_id, place.id %> <%= f.submit 'お気に入り登録', class: 'btn btn-primary' %> <% end %> <% end %> </td> <td> <%= form_with(url: create_complete_path(id: place.id), local: true) do |f| %> <%= hidden_field_tag :place_id, place.id %> <%= f.submit '完了', class: 'btn btn-primary' %> <% end %> </td> </tr> <div id="todo-maps<%=i%>" date-lat="<%=place.latitude%>" date-lng="<%=place.longitude%>" style='width: 100%; height: 500px;'></div> <script src="https://maps.googleapis.com/maps/api/js?key=####&callback=initMap" async defer> function initMap(){ //Idの数だけマップを出力 const e = document.getElementById('todo-maps<%=i%>'); var latlng = new google.maps.LatLng(<%=place.latitude%>,<%=place.longitude%>; map = new google.maps.Map(document.getElementById('todo-maps<%=i%>'),{ center: {lat: <%=place.latitude%>, lng: <%=place.longitude%>}, zoom: 18 }); marker = new google.maps.Marker({ position: latlng, map: map }); } </script> <% end %> <% end %>
かなり省いての全体の説明になりますが、
@places
には登録されているすべての情報があり、each文で一覧表示させています。
次に
<% unless current_user.checkcomp?(place) %>
により行った場所(checkcomp)かどうかを判断しunlessにより行っていない場合(false)は一覧に表示させる文を書いています。
次にマップの表示に関して
<div id="todo-maps<%=i%>" date-lat="<%=place.latitude%>" date-lng="<%=place.longitude%>" style='width: 100%; height: 500px;'></div>
により行っていない場所の緯度経度とマップ表示のためのidを記述しています。
"todo-maps<%=i%>"に関しては複数マップを表示させるためIDをユニークにする必要があると思い、記述しています。"todo-maps0"や"todo-maps1"といった感じです。
scriptでは
const e = document.getElementById('todo-maps<%=i%>');
によりIDを取得し
var latlng = new google.maps.LatLng(<%=place.latitude%>,<%=place.longitude%>;
で緯度経度を取得して表示するという記述をしています。
以上の説明ですが、マップの表示が一番最初のものしか表示することができません。
var latlng = new google.maps.LatLng(<%=place.latitude%>,<%=place.longitude%>;
こちらにはきちんとeach文により取得した緯度経度がそれぞれ入っているのは確認できています。
どのようにすれば複数マップが表示されるのでしょうか、
予想ではtodo-map1 todo-map2 todo-map5のようなIDが作られ
new google.mapsで緯度経度を取得しgetElementByIdによりそれぞれのIDのstyleに反映されて行くイメージでしたが、違うのでしょうか・・・
どのようにしたら複数マップが表示されますか?
HTMLの記述など整っていない点ありますが、ご教授願います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/15 12:07
2022/02/15 12:21
2022/02/15 13:00
2022/02/15 13:02
2022/02/15 13:29
2022/02/15 14:55