LoginSignup
0
0

More than 5 years have passed since last update.

もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜続・エラーを解いてみよう!〜

Last updated at Posted at 2019-04-17

新しい元号が発表され、時代の変化を感じている平成生まれアラサー、もそ。
子どものころに思い浮かべていたアラサー像とは程遠く、時の流れの残酷さを痛感しております...
私もディオみたいに時を止めたい(一瞬しか止まりませんが)

そんなことをぼやきつつ、今日もエラー問題のロープレを頑張っております。

前回に引き続き、今回もモデルとコントローラに関するエラー問題です。

エラー発生、名探偵もそ出動!

まずは実際のエラー画面をみてみましょう。↓

664e908013878c67518484155316c1db.png

まずは現場検証です。
・ログインをした状態で、
・一覧ページから詳細ページをクリックしたとき

に、事件(エラー)は発生しました。

さあ、名探偵もそ(桜ver.)の登場です。

無題1172 2.jpeg

もそは早速、2行目の"Did you mean?comment comment="というコメントと、
赤文字部分の記述に注目。

名探偵もその推理はこうです。

「このエラー文、34行目の記述に出てくる"comments"は"comment"の間違いでは?と言っている」
「ということは、どこかの記述で"comment"という名前の記述があるに違いない...!」

ここでいう「どこかのファイル」は一体どこなのか?

赤くなっている部分の記述は、"showアクションではtweetとcommentsを表示する"という指示です。
このtweetとcommentsは、一つのツイートに対して多数のコメントという一対多の関係となっています。
つまりアソシエーションをしている可能性が高い。

ということは、これはモデルフォルダ配下の記述が怪しいぞ...!
コントローラの記述と、モデルの記述を見比べてみましょう。

controller.rb

   def show
    @tweet = Tweet.find(params[:id])
    @comments = @tweet.comments.includes(:user)
   end
model.rb
_1  class Tweet < ApplicationRecord
_2   belongs_to :user
_3   has_many :comment
_4 end

③と③_3をよーーく見てみてください。

③_3では、has_many :commentとなっています。
この部分の記述は has_many :comments が正解!

名探偵もそ、見事エラーを解決しました!

解説とポイント

今回のポイントは、コントローラファイルの変数はどこで定義されているか?ということ。
(前回の記事でもモデルとアソシエーションについて書いているので、参考にしてみてください。)

コントローラの変数を定義しているのはモデルなのです。

model.rb
_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)ということを示せるのです。

このように記述することで、たとえば他の人がコードを見た時に混乱せずに内容を理解することができます。

無題1175.jpeg

--
いかがだったでしょうか?

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0