新しい元号が発表され、時代の変化を感じている平成生まれアラサー、もそ。
子どものころに思い浮かべていたアラサー像とは程遠く、時の流れの残酷さを痛感しております...
私もディオみたいに時を止めたい(一瞬しか止まりませんが)
そんなことをぼやきつつ、今日もエラー問題のロープレを頑張っております。
前回に引き続き、今回もモデルとコントローラに関するエラー問題です。
エラー発生、名探偵もそ出動!
まずは実際のエラー画面をみてみましょう。↓

まずは現場検証です。
・ログインをした状態で、
・一覧ページから詳細ページをクリックしたとき
に、事件(エラー)は発生しました。
さあ、名探偵もそ(桜ver.)の登場です。
もそは早速、2行目の**"Did you mean?comment comment="というコメント**と、
赤文字部分の記述に注目。
名探偵もその推理はこうです。
「このエラー文、34行目の記述に出てくる"comments"は"comment"の間違いでは?と言っている」
「ということは、どこかの記述で"comment"という名前の記述があるに違いない...!」
ここでいう**「どこかのファイル」は一体どこなのか?**
赤くなっている部分の記述は、"showアクションではtweetとcommentsを表示する"という指示です。
このtweetとcommentsは、一つのツイートに対して多数のコメントという一対多の関係となっています。
つまりアソシエーションをしている可能性が高い。
ということは、これはモデルフォルダ配下の記述が怪しいぞ...!
コントローラの記述と、モデルの記述を見比べてみましょう。
① def show
② @tweet = Tweet.find(params[:id])
③ @comments = @tweet.comments.includes(:user)
④ end
①_1 class Tweet < ApplicationRecord
②_2 belongs_to :user
③_3 has_many :comment
④_4 end
③と③_3をよーーく見てみてください。
③_3では、has_many :commentとなっています。
この部分の記述は has_many :comments が正解!
名探偵もそ、見事エラーを解決しました!
解説とポイント
今回のポイントは、**コントローラファイルの変数はどこで定義されているか?**ということ。
(前回の記事でもモデルとアソシエーションについて書いているので、参考にしてみてください。)
コントローラの変数を定義しているのはモデルなのです。
①_1 class Tweet < ApplicationRecord
②_2 belongs_to :user
③_3 has_many :comments
④_4 end
実は先ほどの問題は、③_3の"comments" の部分を "comment"のままにして、コントローラファイルの③を
③ @comments = @tweet.comments.includes(:user)
としてもエラーは解決できます。
なぜなら、ファイル間で名前が一致していればプログラムを動かすことができるからです。
でもカリキュラムでは"has_many :comments"が紹介されていますし、そちらの表記の方が望ましいです。
何故でしょうか?
実はこれ、単純に英語表記の正しさだけではなく、**③の記述が複数個のtweet要素をもつ配列(=tweets)**ということを示せるのです。
このように記述することで、たとえば他の人がコードを見た時に混乱せずに内容を理解することができます。

--
いかがだったでしょうか?
エラー問題に少し慣れてきたのか、はたまたプログラミング能力が覚醒しつつあるのか、だんだんと理解できるようになってきました!
桜の満開とともに私の能力も開花しますように...もその学習は続く。