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

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

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

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

Q&A

解決済

1回答

2367閲覧

belongs_toから自分の親の要素を取得したい

Yuinyan

総合スコア312

Ruby on Rails

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

0グッド

0クリップ

投稿2017/08/16 07:45

編集2017/08/16 07:47

###前提・実現したいこと
例えばSurvey - Question - Answerという3つのモデル

Survey has_many :questions, :dependent => :destroy, inverse_of: :survey accepts_nested_attributes_for :questions, :reject_if => :all_blank, :allow_destroy => true
Question belongs_to :survey, optional: true,inverse_of: :questions has_many :answers, :dependent => :destroy, inverse_of: :question accepts_nested_attributes_for :answers, :reject_if => :all_blank, :allow_destroy => true
Answer belongs_to :question, optional: true,inverse_of: :answers

となっており、
Questionのindexページから、SurveyのTitleを下記のような形で取得をしたいです。どのようにすればよいでしょうか。

<tbody> <% @questions.each do |question| %> <tr> <td><%= question.survey.title %></td> <td><%= question.qtitle %></td> <td><%= question.body %></td> <td><%= link_to 'Show', question %></td> <td><%= link_to 'Edit', edit_question_path(question) %></td> <td><%= link_to 'Destroy', question, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody>

のようにして、取得したいのですが、no method errorとなってしまいます。

<%= question.survey.inspect %>

とすると実際には、この画像のように値は入っています。

https://i.gyazo.com/08495a657c663b607cf8bdef16ac1732.png

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

undefined method `title' for nil:NilClass

###補足情報(言語/FW/ツール等のバージョンなど)
ruby on rails5.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

Questionモデルで

ruby

1belongs_to :survey, optional: true,inverse_of: :questions

とやっているので、question.survey_idがnilのものが許容されています。
そのためquestion.survey = nilとなるquestionが存在しているはずです。画像から見るに2つ目のデータですね。
で、nilに対して、titleを呼び出しているのでエラーが出てしまっているということです。
question.surveyが必ず存在するなら、optional: trueを削除。
そうでないなら

<td><%= question.survey.title if question.survey_id.present? %></td>

という風にnilチェックしましょう

投稿2017/08/16 08:12

編集2017/08/16 08:15
chelsy7110

総合スコア596

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

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

maisumakun

2017/08/16 09:32

tryを使った「questuion.survey.try!(:title)」や、Ruby 2.3以上であれば「question.survey&.title」という形にするという方法もあって、question.surveyがnilでも単にnilとなるだけで、エラーにならなくなります(<%= nil %>は、何も表示しません)。
Yuinyan

2017/08/16 09:35

早々のご回答、誠に有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問