本試験復習 番外編
問題:トップページにアクセスした時にRouting Errorが起こる。
原因:uninitialized constantは「定義したクラスを読むことができない」ことを言っている。
この場合uninitialized constant TweetControllerを読み込むことができないと言っている。
解決:まず、TweetControllerを定義されているはずのcontrollersを見に行く
app/controllers/tweets_controller.rbはあるが、class TweetsControllerと書いてある。
つまり、これを呼び出そうとしているルーティングに問題があると考えられる為、routes.rbを見に行く。
すると、root to: "tweet#index”とあり、tweetsを定義していない。
回答:よって、root to: "tweets#index”と書いて正解。
問題:ツイートの作成ページにアクセスすると、エラーが出る。(NameError in TweetsController#new)
原因:undefined local variable or methodは変数のスペルミスや指定間違いを表す。
この場合、undefined local variable or method `user_signed_in' for #<TweetsController:0x00007f9ed7b400c8> Did you mean? user_signed_in?と表記されており
user_signed_inの指定に誤りが無いかを表している。
解決:まず、スペルミスが無いかの確認をする為、記載があるapp/controllers/tweets_controller.rbを確認する。
すると、ログインしているユーザーが記載する為には、user_signed_inの後の?が無い。
回答:その為、user_signed_in?と追記して正解。
問題:ツイートの作成ページにアクセスすると、エラーが出る。(No route matches [POST] "/tweets”)
原因:No route matches [POST] "/tweets”はtweetsコントローラから一致するルーティングが無いというエラーである。
この場合、画面に記載されているエラー文の下を見に行くと、root_path GET / tweets#indexとあり、
ルーティングが無いと考えられる為、routes.rbを見に行く。
解決:すると、createがcraeteとスペルミスがあった。
回答:よって、createに訂正して正解。
問題:投稿したツイートの詳細ページにアクセスするとエラーがでる。(Routing Error)
原因:No route matches [GET] "/tweets/1”とあり、tweetsから詳細ページに行くためのルーティングが無いというエラーである。
この場合、画面に記載されているエラー文の下を見に行くと、root_path GET / tweets#indexとあり、
ルーティングが無いと考えられる為、routes.rbを見に行く。
解決:すると、showがshoeとスペルミスがあった。
回答:よって、showに訂正して正解。
問題:上記のエラーを解決しても続けてエラーが出る。(NoMethodError)
原因:undefined method `comments' for #<Tweet:0x00007f9edcaddcc0> Did you mean? committed!と書いてあり、
詳細を見るためのコントローラーにそのアクションが無い場合に起こるエラー
commentsを読み取れないよということである。
回答:モデルから読み取るため、モデルを見に行くと、アソシエーションが定義されてない。
よって、アソシエーションを定義することで、正解。(tweets.rbにhas_many :comments)
※エラー文で、@commentsとcommentsではエラーの対象が違う
問題:コメントの投稿ボタンを押すとエラーが出る。(Routing Error)
原因:No route matches [POST] "/tweets/1/comments”と書いてあり、tweetsからコメントに行くためのルーティングが無いというエラーである。
この場合、画面に記載されているエラー文の下を見に行くと、root_path GET / tweets#indexとあり、
ルーティングが無いと考えられる為、routes.rbを見に行く。
回答:スペルミスが無いようなので、次は何か仮説を立ててみる。
コメントのルーティングをツイートのルーティングにネストしていないため、form_tagで設定したようなルーティングが設定されていなかった。
よって、
resources :tweets, only: [:index, :show, :new, :create, :destroy, :edit, :update]
resources :comments, only: [:create]
→resources :tweets, only: [:index, :show, :new, :create, :destroy, :edit, :update] do
resources :comments, only: [:create]
end
と記載して正解
疑問点:全体文章見るとdoの数が不足しているように見えない。ルーティングのネストに気づかない。←スペルミスとかが無いときに、ネストを疑うべきなのか?
※コメントで、かつルーティングエラーはネストを疑う。
何やろうとしたか、エラー文は何か。
紐付く対象のルーティングに追加する。
例)コメントが紐付く対象、ツイート。
問題:コメントを投稿したあとにエラーが出る。(NoMethodError)
原因:undefined method `text' と書いてあり、コメント投稿を表示するための要素がありませんよということである。
show.html.erbを見に行く
回答:@comments.textとしていため。textはCommentクラス(モデル)のインスタンスが保持する値であるため、ActiveRecord_Relationに対して使用することはできない。
よって<%= comment.text %>と記載して正解
疑問点:何故そうなる?
左複数.each.do l右単数l→左から右へ一個ずつ取り出す。取ってきている時点で単数のため、単数しか表示はあり得ない。
そこから取り出した要素を表示する為のコードを書く必要がある。
だから、上記のようになる。
エラー文を見て、その前後に何かある。
params(運び屋イメージ)、eachアクションで使っている所の記述を見る(構文の中のどこかで使っている)、
エラー文が無いときの解決方法。
・何をしたいかから考える。
→まず、データベースに表示されているのかを確認する。
→表示されているなら、show.html.erbを見にく。
→文法、構文も問題無い。
→@commentsの呼び出し元が記載ある、tweets.controllar.rbはどうなのか。
→def showの下を見ると@commentと単数形になっていて、@commentsとリンクするところがない。
→よって、@commentsと変更して正解。