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

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

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

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

Ruby on Rails 6

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

JavaScript

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

Q&A

解決済

1回答

1177閲覧

Railsで投稿機能に住所を追加し、投稿一覧に表示したい。

hinata_hakumai

総合スコア3

Ruby

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

Ruby on Rails 6

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

JavaScript

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

0グッド

0クリップ

投稿2021/10/27 16:51

前提・実現したいこと

ポートフォリオとしてスポットの共有アプリを作成しています。
機能の1つとして投稿機能を実装しており、フォームに入力、データの保存はできているようなのですが、ビューにて住所(address)が表示されないため、質問させていただきました。
Postを親モデル、Mapを子モデルとしているため、関連付けが曖昧になっているのではないかと思い、何度も確認したのですが解決に至りませんでした。
お力添えをいただければと思います。よろしくお願いします。

発生している問題・エラーメッセージ

下記のエラーがでており、表示されません。
イメージ説明
Postを親モデル、Mapを子モデルとして作成しています。

該当のソースコード

html

1posts/index.html.erb 2 3<%= render 'posts/new' %> 4. 5. 6. 7<span><%= post.maps.address %></span>

ruby

1posts/_new.html.rb 2 3 <%= form_with model: @post, class: "upload-images p-0 border-0" do |f| %> 4 <div class="form-group"> 5 <label>住所</label> 6 <div> 7 <%= f.fields_for :maps, @post.maps.build do |m| %> 8 <%= m.text_field :address, class: "form-control", placeholder: "住所" %> 9 <% end %> 10 </div> 11 <div class="form-group mb-3"> 12 <div class="col-auto pr-0"></div> 13 <label>テキスト</label> 14 <div> 15 <%= f.text_field :caption, class: "form-control", placeholder: "コメントを入力する" %> 16 </div> 17 </div> 18 <div class="mb-3"> 19 <%= f.fields_for :photos do |i| %> 20 <%= i.file_field :image %> 21 <% end %> 22 </div> 23 <%= f.submit "投稿する", class: "btn btn-primary" %> 24 <% end %>

ruby

1models/post.rb 2 3class Post < ApplicationRecord 4 belongs_to :user 5 has_many :maps, dependent: :destroy 6 has_many :photos, dependent: :destroy 7 accepts_nested_attributes_for :photos 8 accepts_nested_attributes_for :maps 9end

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 9

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 = Post.new 21 @post.photos.build 22 @post.maps.build 23 @posts = Post.limit(10).includes(:maps, :photos, :user).order('created_at DESC') 24 end 25 26 def show 27 @post = Post.find_by(id: params[:id]) 28 end 29 30 def destroy 31 @post = Post.find_by(id: params[:id]) 32 if @post.user == current_user 33 flash[:notice] = "投稿が削除されました" if @post.destroy 34 else 35 flash[:alert] = "投稿の削除に失敗しました" 36 end 37 redirect_to root_path 38 end 39 40 private 41 42 def post_params 43 params.require(:post).permit(:caption, maps_attributes: [:address, :latitude, :longitude], photos_attributes: [:image]).merge(user_id: current_user.id) 44 end 45 46 def set_post 47 @post = Post.find_by(id: params[:id]) 48 end 49end

ruby

1routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users, 5 controllers: { registrations: 'registrations' } 6 root 'posts#index' 7 resources :users 8 resources :posts, only: %i[index new create show destroy] do 9 resources :photos, only: %i[create] 10 resources :maps, only: %i[create] 11 end 12end 13

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 31

db
イメージ説明

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

Rails 6.1.4.1
Mac OS

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1class Post < ApplicationRecord 2 belongs_to :user 3 has_many :maps, dependent: :destroy 4 has_many :photos, dependent: :destroy 5 accepts_nested_attributes_for :photos 6 accepts_nested_attributes_for :maps 7end

Postに対してmapsが複数なので、配列(のようなもの)にaddressというメソッドがないとエラーが出てます。
has_oneで一つだけ取得できるように変更するか、複数住所がある場合はviewで表示する際にeachなどでひとつずつaddressを表示してあげる必要があります。

なお、おそらく挙動としては問題ないかと思いますが、has_oneにした時にmapという名前だと既存のメソッドを上書きする恐れがあることを留意してください。

投稿2021/10/27 17:08

satoshih

総合スコア799

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

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

hinata_hakumai

2021/10/27 18:05 編集

ご回答ありがとうございます。 ご指摘いただいた通り、has_oneで取得できるよう修正したのですがundefined method `address' for nil:NilClassとなり、変わらずエラーになってしまいます。 下記のように変更したのですが、間違いがありますでしょうか。 何度もすみませんがよろしくお願いします。 ※変更した箇所のみ抜粋しております。 #models/post.rb class Post < ApplicationRecord has_one :map, dependent: :destroy accepts_nested_attributes_for :map end #controllers/posts.controller.rb class PostsController < ApplicationController def index @post.build_map @posts = Post.limit(10).includes(:map, :photos, :user).order('created_at DESC') end private def post_params params.require(:post).permit(:caption, map_attributes: [:address, :latitude, :longitude], photos_attributes: [:image]).merge(user_id: current_user.id) end end #posts/_new.html.rb <%= f.fields_for :map, @post.build_map do |m| %> <%= m.text_field :address, class: "form-control", placeholder: "住所" %> <% end %> #posts/index.html.erb <span><%= post.map.address %></span>
satoshih

2021/10/28 01:16

Postに対してmapがない場合にaddressの箇所に何も表示しなくてで良ければViewの @post.map.address を @post.map&.address に変更してみてください これは @post.map が nil の場合は nil を返し、値がある場合はmapのaddressを返す構文です。
hinata_hakumai

2021/10/28 01:29

何度も回答ありがとうございます。 <span><%= post.map&.address %></span>  に変更したところ無事表示されました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問