質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

801閲覧

DBに保存されている住所をGooglemapにマーカー表示したい。

hinata_hakumai

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/10/28 10:29

前提・実現したいこと

スポットの共有アプリを作成しています。
投稿機能によってDBに保存された住所をMap上にマーカー表示したいです。
現状マップクリックと検索よってマーカーを表示する機能は実装済みなのですが、リロード後消えてしまいます。

該当のソースコード

ruby

1_map.html.erb 2 3<div id='map'></div> 4 5<style> 6#map { 7 height: 50vh; 8 width: 60vw; 9 margin: 0 auto; 10} 11</style> 12 13<script> 14 let map 15 let geocoder 16 17 function initMap(){ 18 geocoder = new google.maps.Geocoder() 19 if(!navigator.geolocation) { 20 alert('Geolocation APIに対応していません'); 21 return false; 22 } 23 24 navigator.geolocation.getCurrentPosition(function(position) { 25 latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 26 27 map = new google.maps.Map(document.getElementById('map'), { 28 center: latLng, 29 zoom: 12, 30 }); 31 32 marker = new google.maps.Marker({ 33 position: latLng, 34 map: map 35 }); 36 37 var geocoder = new google.maps.Geocoder(); 38 39 map.addListener('click', function(e){ 40 geocoder.geocode({location: e.latLng}, function(results, status){ 41 if(status === 'OK' && results[0]) { 42 43 var marker = new google.maps.Marker({ 44 position: e.latLng, 45 map: map, 46 title: results[0].formatted_address, 47 animation: google.maps.Animation.DROP 48 }); 49 50 var infoWindow = new google.maps.InfoWindow({ 51 content: results[0].formatted_address, 52 pixelOffset: new google.maps.Size(0, 5) 53 }); 54 55 marker.addListener('click', function(){ 56 infoWindow.open(map, marker); 57 }); 58 59 infoWindow.addListener('closeclick', function(){ 60 marker.setMap(null); 61 }); 62 }else if(status === 'ZERO_RESULTS') { 63 alert('不明なアドレスです: ' + status); 64 return; 65 }else{ 66 alert('失敗しました: ' + status); 67 return; 68 } 69 }); 70 }); 71 }, function() { 72 alert('位置情報取得に失敗しました'); 73 }); 74 } 75 76 function codeAddress(){ 77 let inputAddress = document.getElementById('address').value; 78 79 geocoder.geocode( { 'address': inputAddress}, function(results, status) { 80 if (status == 'OK') { 81 map.setCenter(results[0].geometry.location); 82 let marker = new google.maps.Marker({ 83 map: map, 84 position: results[0].geometry.location 85 }); 86 87 let address = document.getElementById('address'); 88 address.setAttribute("value", inputAddress); 89 90 let hidden_address = document.getElementById('hidden_address'); 91 hidden_address.setAttribute("value", inputAddress); 92 93 } else { 94 alert('該当する結果がありませんでした:' + status); 95 } 96 }); 97 } 98</script>

ruby

1posts/_new.html.erb 2 3<aside class="col-md-5"> 4 <div class="d-flex flex-column align-items-center mt-3 w-100"> 5 <div class="col-xl-7 col-lg-8 col-md-10 col-sm-11 post-card"> 6 <div class="card"> 7 <div class="card-body"> 8 <div class="form-group"> 9 <label>レビュー場所(Google Mapで検索)</label> 10 <div class="search-form"> 11 <input id="address" class="form-control" type="textbox" placeholder="スポットを入力"> 12 <button type="button" class="search-button" value="検索" onclick="codeAddress()"> 13 <i class="fas fa-search"></i> 14 </button> 15 </div> 16 </div> 17 <%= form_with model: @post, class: "upload-images p-0 border-0" do |f| %> 18 <div class="form-group"> 19 <label>住所</label> 20 <div> 21 <%= f.fields_for :map, @post.build_map do |m| %> 22 <%= m.text_field :address, class: "form-control", placeholder: "住所", name: "post[map_attributes][address]", id: "hidden_address" %> 23 <%= m.hidden_field :latitude %> 24 <%= m.hidden_field :longitude %> 25 <% end %> 26 </div> 27 <div class="form-group mb-3"> 28 <div class="col-auto pr-0"></div> 29 <label>テキスト</label> 30 <div> 31 <%= f.text_field :caption, class: "form-control", placeholder: "コメントを入力する" %> 32 </div> 33 </div> 34 <div class="mb-3"> 35 <%= f.fields_for :photos do |i| %> 36 <%= i.file_field :image %> 37 <% end %> 38 </div> 39 <%= f.submit "投稿する", class: "btn btn-primary" %> 40 <% end %> 41 </div> 42 </div> 43 </div> 44 </div> 45</aside> 46

ruby

1models/map.rb 2 3class Map < ApplicationRecord 4 belongs_to :post 5 6 geocoded_by :address 7 after_validation :geocode, if: :address_changed? 8end

ruby

1db/migrate 2 3class CreateMaps < ActiveRecord::Migration[6.1] 4 def change 5 create_table :maps do |t| 6 t.string :address 7 t.float :latitude 8 t.float :longitude 9 10 t.timestamps 11 end 12 end 13end 14 15class AddColumnToMap < ActiveRecord::Migration[6.1] 16 def change 17 add_reference :maps, :post, null: false, foreign_key: true 18 end 19end 20 21class CreatePosts < ActiveRecord::Migration[6.1] 22 def change 23 create_table :posts do |t| 24 t.string :caption 25 t.references :user, foreign_key: true, null: false 26 27 t.timestamps 28 end 29 end 30end

ruby

1controllers/posts.controller.rb 2 3class PostsController < ApplicationController 4 before_action :authenticate_user! 5 6 def new 7 end 8 9 def create 10 @post = Post.new(post_params) 11 redirect_to root_path 12 if @post.save 13 flash[:notice] = "投稿が保存されました" 14 else 15 flash[:alert] = "投稿に失敗しました" 16 end 17 end 18 19 def index 20 @post.build_map 21 @posts = Post.limit(10).includes(:map, :photos, 22 :user).order('created_at DESC') 23 end 24 25 def show 26 @post = Post.find_by(id: params[:id]) 27 end 28 29 def destroy 30 @post = Post.find_by(id: params[:id]) 31 if @post.user == current_user 32 flash[:notice] = "投稿が削除されました" if @post.destroy 33 else 34 flash[:alert] = "投稿の削除に失敗しました" 35 end 36 redirect_to root_path 37 end 38 39 private 40 41 def post_params 42 params.require(:post).permit(:caption, map_attributes: [:address, :latitude, :longitude], photos_attributes: [:image]).merge(user_id: current_user.id) 43 end 44 45 def set_post 46 @post = Post.find_by(id: params[:id]) 47 end 48end

イメージ説明

試したこと

https://qiita.com/shunuke-y/items/0e234ef16803bc0da12b
https://qiita.com/momonoki1990/items/31390a355e2f6d24a81b

上記記事を参考に試行錯誤したのですがうまくいきません。
お手数ですがアドバイスいただければと思います。

補足情報(FW/ツールのバージョンなど)

Rails 6.1.4.1
Mac OS
docker

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

<% @posts.each do |post| %>
<% end %>

each文を使うことで解決いたしました。

投稿2021/10/29 09:25

hinata_hakumai

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問