学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Rails6.1 | 民泊予約アプリ作成 | 24 | Google Maps

↓↓クリックして頂けると励みになります。


23 | Application Helper】 << 【ホーム】 >> 【25 | Facebook認証


Googleマップで登録した部屋をページに表示させます。
それにはまず、Google Cloud PlatformにGoogleアカウントでログインしてAPIキーを取得する必要があります。
手順は以下の通りにお願いします。
mrradiology.hatenablog.jp


Geocoderを利用する時に合わせてAPIを登録してある場合は、それで構いません。
mrradiology.hatenablog.jp

「config\initializers\geocoder.rb」ファイルに以下の記述を追加します。

 units: :km



記述追加 【config\initializers\geocoder.rb】

Geocoder.configure(
  api_key: 'ご自分のAPIキーを入れてください。',
  use_https: true,
  timeout: 5,
  units: :km
)





GoogleマップAPIの埋め込み
取得したキーを「key=」から「&callback」の間に埋め込んで下さい。

<script async defer src="https://maps.googleapis.com/maps/api/js?key=ここにご自分のAPIキーを埋め込みます&callback=initMap" type="text/javascript"></script>



このscriptタグをサイトに埋め込みます。


1.記述追加 app\views\rooms\show.html.erb(111行目)

            <!-- GOOGLE マップ -->
            <div class="card mt-4">
                <div class="card-body">
                    
                    <div id="map" style="width: 100%; height: 400px"></div>
                    <script src="https://maps.googleapis.com/maps/api/js"></script>
                    <script>
                        function initialize() {
                            var location = {lat: <%= @room.latitude %>, lng: <%= @room.longitude %>};
                            var map = new google.maps.Map(document.getElementById('map'), {
                            center: location,
                            zoom: 14
                            });
                            var marker = new google.maps.Marker({
                            position: location,
                            map: map
                            });
                            var infoWindow = new google.maps.InfoWindow({
                            content: '<div id="content"><%= image_tag room_cover(@room), style: "width: 100px;" %></div>'
                            });
                            infoWindow.open(map, marker);
                        }
                        google.maps.event.addDomListener(window, 'load', initialize);
                    </script>
                    <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDoAh6S8kEpArgzGFEvjT_0xK_VeUL5SEs&callback=initMap" type="text/javascript"></script>

                </div>
            </div>



2.記述追加 app\views\rooms\show.html.erb(140行目)

            <!-- 近くのお部屋を検索 -->
            <div class="card mt-4 mb-4">
                <div class="card-body">
                    <h3 class="badge bg-secondary">近くの部屋</h3>
                    <div class="row">
                    <% for room in @room.nearbys(10) %>                    
                        <div class="col-md-4">
                        <div class="card mb-2">
                        <div class="card-body">
                        <%= link_to room_path(room), data: { turbolinks: false} do %>
                                <%= image_tag room_cover(room), style: "width: 100%;" %>   
                        <% end %>                 
                            <div>
                            <%= link_to room.listing_name, room, class: "btn btn-light" %>
                            </div>
                            <div class="badge bg-danger">距離:<%= room.distance.round(2) %> Km</div>

                        </div>
                        </div>

                        </div>
                    <% end %>
                    </div>
                </div>
            </div>



app\views\rooms\show.html.erb

<div class="container mt-4">
    <div class="row">
        <!-- 右側 -->
        <div class="col-md-3">

            <!-- 予約フォーム -->

        </div>
        <!-- 左側 -->
        <div class="col-md-9 mb-4">

            <!-- カルーセル表示 -->
            <div class="card">
                <div class="card-body">

                    <div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel">
                        <div class="carousel-indicators">
                            <% @photos.each do |photo| %>
                                <button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="<%= @i %>" class="<%= 'active' if photo.id == @photos[0].id %>" aria-current="true" aria-label="Slide <%= @i+1 %>"></button>
                                <% @i = @i +1 %>
                            <% end %>
                        </div>
                        <div class="carousel-inner">
                            <% @photos.each do |photo| %>
                                <div class="carousel-item <%= 'active' if photo.id == @photos[0].id %>">
                                    <%= image_tag url_for(photo), class: "d-block w-100", style: "border-radius: 10px;", alt: "アマチュアレポートワールドでアマチュア記者が自分の声を世界に届けるために投稿した記事の画像" %>
                                </div>
                            <% end %>
                        </div>
                        <button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="prev">
                            <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                            <span class="visually-hidden">Previous</span>
                        </button>
                        <button class="carousel-control-next" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="next">
                            <span class="carousel-control-next-icon" aria-hidden="true"></span>
                            <span class="visually-hidden">Next</span>
                        </button>
                    </div>
                </div>
            </div>

            <div class="card mb-2 mt-2">
                <div class="card-body">
                    <h2 class="mb-4 mt-4"><%= @room.listing_name %></h2>

                    <div class="fs-5"><%= @room.address %></div>
                    <div class="mt-4">
                    <%= link_to user_path(@room.user), style: "text-decoration:none;" do %>
                        <%= image_tag avatar_url(@room.user), class: "bd-placeholder-img figure-img img-fluid rounded-pill", style: "width: 40px; height: 30px;" %>
                        <span class="badge bg-light text-dark"><%= @room.user.full_name %></span>
                    <% end %>
                    </div>

                </div>
            </div>

            <!-- 部屋のインフォメーション -->
            <div class="card mb-2">
                <div class="card-body">    
                    <div class="row">
                        <div class="col-3">
                            <i class="fas fa-home fa-2x" style="color: cadetblue"></i><br/>
                            <%= @room.home_type %>
                        </div>
                        <div class="col-3">
                            <i class="fas fa-user fa-2x" style="color: cadetblue"></i><br/>
                            <%= pluralize(@room.accommodate, "人宿泊可能") %>
                        </div>
                        <div class="col-3">
                            <i class="fas fa-bed fa-2x" style="color: cadetblue"></i><br/>
                            <%= pluralize(@room.bed_room, "台") %>
                        </div>
                        <div class="col-3">
                            <i class="fas fa-door-closed fa-2x" style="color: cadetblue"></i><br/>
                            <%= pluralize(@room.bath_room, "部屋") %>
                        </div>
                    </div>
                </div>
            </div>

            <div class="card">
                <div class="card-body">        
                    <div class="badge bg-secondary mb-4">部屋の詳細</div>
                    <p><%= @room.summary %></p>
                </div>
            </div>            

            <!-- アメニティ -->
            <div class="card mt-2">
                <div class="card-body">        
                    <div class="badge bg-secondary mb-4">アメニティ</div>

                    <div class="row">
                        <div class="col-6">
                            <ul style="list-style:none;">
                                <li class="<%= 'text-line-through' if !@room.is_tv %>"><span style="color: black;"><i class="fas fa-tv"></i>&nbsp;テレビ</span></li>
                                <li class="<%= 'text-line-through' if !@room.is_kitchen %>"><span style="color: black;"><i class="fas fa-blender"></i>&nbsp;キッチン</span></li>
                                <li class="<%= 'text-line-through' if !@room.is_internet %>"><span style="color: black;"><i class="fas fa-wifi"></i>&nbsp;Wi-Fi</span></li>
                            </ul>
                        </div>
                        <div class="col-6">
                            <ul style="list-style:none;">
                                <li class="<%= 'text-line-through' if !@room.is_heating %>"><span style="color: black;"><i class="fab fa-hotjar"></i>&nbsp;暖房</span></li>
                                <li class="<%= 'text-line-through' if !@room.is_air %>"><span style="color: black;"><i class="fas fa-temperature-low"></i>&nbsp;エアコン</span></li>
                            </ul>
                        </div>
                    </div>
                </div>           
            </div>

            <!-- GOOGLE マップ -->
            <div class="card mt-4">
                <div class="card-body">
                    
                    <div id="map" style="width: 100%; height: 400px"></div>
                    <script src="https://maps.googleapis.com/maps/api/js"></script>
                    <script>
                        function initialize() {
                            var location = {lat: <%= @room.latitude %>, lng: <%= @room.longitude %>};
                            var map = new google.maps.Map(document.getElementById('map'), {
                            center: location,
                            zoom: 14
                            });
                            var marker = new google.maps.Marker({
                            position: location,
                            map: map
                            });
                            var infoWindow = new google.maps.InfoWindow({
                            content: '<div id="content"><%= image_tag room_cover(@room), style: "width: 100px;" %></div>'
                            });
                            infoWindow.open(map, marker);
                        }
                        google.maps.event.addDomListener(window, 'load', initialize);
                    </script>
                    <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDoAh6S8kEpArgzGFEvjT_0xK_VeUL5SEs&callback=initMap" type="text/javascript"></script>

                </div>
            </div>

            <!-- 近くのお部屋を検索 -->
            <div class="card mt-4 mb-4">
                <div class="card-body">
                    <h3 class="badge bg-secondary">近くの部屋</h3>
                    <div class="row">
                    <% for room in @room.nearbys(10) %>                    
                        <div class="col-md-4">
                        <div class="card mb-2">
                        <div class="card-body">
                        <%= link_to room_path(room), data: { turbolinks: false} do %>
                                <%= image_tag room_cover(room), style: "width: 100%;" %>   
                        <% end %>                 
                            <div>
                            <%= link_to room.listing_name, room, class: "btn btn-light" %>
                            </div>
                            <div class="badge bg-danger">距離:<%= room.distance.round(2) %> Km</div>

                        </div>
                        </div>

                        </div>
                    <% end %>
                    </div>
                </div>
            </div>

        </div>
    </div>
</div>



ブラウザで確認します。
http://localhost:3000/rooms/1

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



23 | Application Helper】 << 【ホーム】 >> 【25 | Facebook認証


↓↓クリックして頂けると励みになります。