underfinded-method Railsエラー問題の解決するための考え方 その1 ~番外編~

1)productのshowページに行くと、underfined-method `title`が出る

→show.html.erbのエラー個所、@product.titleを見てみる。

インスタンス変数@productがおかしい?productコントローラを見に行く

→def showの中を見ると、@productのスペルは・・・正しい。

→作ったmooviを見比べると、where(params[:id])なのにfind(params[:id])になっている。

→whereをfindに直して正解

 

2)ログインしない状態でlocalhost:3000/にアクセスするとundefined method nickname for nil:NilClassのエラーが起きる

→表示部分に関するエラーの為、app/views/layouts/application.html.erbを見に行く、

→29行目に<% if true %>とあるが、そもそも条件分岐もされていないのでおかしいし、ユーザーがサインインしているしていないで出てくる画面も変わるはずで、もし、ユーザーがサインインしているなら?していないなら?の部分が抜けている。

→<% if true %><% if user_signed_in? %>にすることで正解

user_signed_in?の場合はユーザーがログインしてなかったらこのif文自体全部スキップさせるようです。なのでcurrent_user.idを参照することなく、end以降にジャンプします。なのでユーザーがログインしてなくてもあのエラー画面には遷移しないようです。

 

3)/users/1のユーザーのマイページに遷移した時に、NoMethodErrorが出て、画面を表示することが出来なくなっているので、画面を表示出来るように修正をして下さい。

→undefined method `reviews' for #<User:0x00007f83cea9d130>と表示があるので、ユーザーの要素に問題があると考えられる為、app/models/user.rbをみる。

すると、複数のモデルの関連付けについての記載が全く無い。

よって、has_many :reviewsを追記することで正解。

 

4)localhost3000にアクセスしようとすると、エラーになる。

NoMethodError in Products#indexとあり、undefined method `each' for nil:NilClassと出てくる。

→app/views/products/index.html.erb と記載もある為、ここを見にいく。

エラー文の通り、14行目を見ると、eachメソッドを使って定義しているが、@productが単数形になっている。

よって@productsと記載して正解。

 

5)上記解決するも新たなエラーです。

→NoMethodError in Products#indexとあり、undefined method `reviews' for #<Product:0x00007fcf963a34b0>

Did you mean?  review review=と書かれている。

→app/views/products/index.html.erb と記載もある為、ここを見にいく。

ここの記載には問題なさそうなので、次はMVCのモデルにあたるproduct.rbを見にく。

→has_many :reviewが単数形になっている。

よってhas_many :reviewsと書き直して正解。

 

6)マイページにアクセスするとエラーが表示される

→undefined method `text' と表記されており、showing /Users/masamac/Desktop/mooovi-exam3/app/views/users/show.html.erb と書いてあるので見に行く。

→21行目を見ると、<div class="user_review"><%= review.text %></div>と記載がある。

アソシエーションが定義されているのはreviewであるので、<%= review.review %>と記載して正解。