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 %>と記載して正解。