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

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

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

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

Q&A

1回答

229閲覧

Rails アソシエーションでの エラー

linkwood

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2021/10/03 06:41

編集2021/10/03 08:04

前提・実現したいこと

railsの勉強を始めたばかりで、入門書の見本を見ながらコードを打ち込んでいます。
アソシエーションの項目で行き詰まり、どこが間違えているのかがわかりません。

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

ActionView::Template::Error (undefined method `name' for nil:NilClass): 9: <tr> 10: <td><%= obj.id %></td> 11: <td><a href = "/messages/<%= obj.id %>"><%= obj.title %></a></td> 12: <td><%= obj.person.name %></td> 13: <td><a href = "/messages/edit/<%= obj.id %>">Edit</a><td> 14: <td><a href = "javascript:delData(<%= obj.id %>);">Delete</a></td> 15: </tr> app/views/messages/index.html.erb:12 app/views/messages/index.html.erb:8

該当のソースコード

app//views/messages/index.html.erb

<h1 class = "display-4 text-primary"> Message#index</h1> <p><%= @msg %></p> <table class = "table"> <tr> <th>Id</th><th>title</th><th>person</th><th colspan = "2"></th> </tr> <% @data.each do |obj| %> <tr> <td><%= obj.id %></td> <td><a href = "/messages/<%= obj.id %>"><%= obj.title %></a></td> <td><%= obj.person.name %></td> <td><a href = "/messages/edit/<%= obj.id %>">Edit</a><td> <td><a href = "javascript:delData(<%= obj.id %>);">Delete</a></td> </tr> <% end %> </table> <script> function delData(num){ if (confirm('このデータを削除しますか?')){ document.location = "/messages/delete/" + num; } return false; } </script>

app/models/message.rb

class Message < ApplicationRecord belongs_to :person validates :message, presence: {message: "を書いてください。"} end

app/views/people/show.html.erb

<h1 class = "display-4 taxt-primary">People#show</h1> <p><%= @msg %></p> <table class = "table"> <tr><th>Id</th> <td><%= @data.id %></td></tr> <tr><th>Name</th> <td><%= @data.name %></td></tr> <tr><th>Age</th> <td><%= @data.age %></td></tr> <tr><th>Mail</th> <td><%= @data.mail %></td></tr> <tr><th>Maessage</th> <td> <% if @data.message != nil then %> <% @data.message.each do |obj| %> <%= "「" + obj.title + "」" %> <% end %> <% end %> </td></tr> </table>

app/controllers/messages_controller.rb

class MessagesController < ApplicationController layout "messages" def index @msg = "Massage data." @data = Message.all end def show @msg = "Indexed data." @message = Message.find(params[:id]) end def add @msg = "Massege data." @message = Message.new end def create @message = Message.new message_params if @message.save then redirect_to "/messages" else render "add" end end def edit @msg = "edit data.[id = " + params[:id] + "]" @message = Message.find(params[:id]) end def update obj = Message.find(params[:id]) obj.update(message_params) redirect_to "/messages" end def delete obj = Message.find(params[:id]) obj.destroy redirect_to "/messages" end private def message_params params.require(:message).permit(:person_id, :title, :message) end end

試したこと

コードの打ち間違いが無いかはセルフチェックですが、何度も行いました。
people/showでは問題なくnameメソッドが呼び出せているため、モデル作成時の間違いでは
ないと考えています。
サーバーの再起動は行いました。

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

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

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

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

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

winterboum

2021/10/03 07:39

MessageControllee を載せてください
guest

回答1

0

回答の前に
<% @data.each do |obj| %>
これよろしくないです。
<% @messages.each do |message| %>
としましょう。
@dataって何だろう、 obj.person.name の objって何だろう、
と余分な思考が必要になります。

で、
person の ない message でこのエラーが起きています。
しかし この関連定義ですと そういうmessageができるわけがありません。

ということは、この関連定義をいれる前に messageを単独でつくってみたりしていませんか?
そういう正常ではないデータが紛れていると思われます。
rails c にて
Message.where(person_id: nil)
で見てみてください

投稿2021/10/03 08:26

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問