link_toが機能しない!
posts#show(PostsControllerのshowアクション)からview/posts/show.html.erbを表示させたい。
ということでまず、rails routeのコマンドでリンク先のurlを取得
左列のPrefix(○○_pathと入力することでリンク先へ飛べるメソッド)を使うと、「posts#show(PostsControllerのshowアクション)からview/posts/show.html.erbを表示させるには、"post"を使え」と書いてある。つまり、"post_path(インスタンス変数)"いうメソッドを使えばリンクを飛ばせるよ、ってことらしい。
そこで12行目に以下のメソッドを入力。
するとエラーが発生する。
ここは本題からそれるので概要だけ話すと、(ルーティング設定時に自動で生成されるリンクメソッドである)○○_pathを使ってリンク先を書く時に、定義をしていない@post(コントローラーで作る変数)を使うこと自体おかしいらしい。
なので今度は8行目に記載した<%= @posts.each do |post| %>で全てのポスト(全投稿データ)をそれぞれ1つずつ表示するメソッドを記入しているので、そのそれぞれ1つずつの意味を表す変数postをリンク先の変数として入れた。
(12行目のコードがpost_path(@post)からpost_path(post)にしたということ)
でもエラー。
なぜか。
それは、私がリンク先を表示するために作ったPostsControllerのshowアクションに原因があったのだ。
エラーコードとして出ているが、postsテーブルからid:13の投稿データを取得したいのに、@user = User.find[params(:id)]も記述したことにより、usersテーブルからid:13のユーザ情報も取得しようとしてしまったことで「おい、13人目のユーザ(id:13を持つユーザ)なんて見つけられねーぞ!」とお叱りを受けてしまったのだ。
ということで、この1文(@user = User.find[params(:id)])を削除。
を
にしました。
が、また再チャレンジするとエラー。
原因はposts/show.html.erbの5行目に記述したrender内の変数を設定するところ。
(user: @userの部分)
今度は@user変数を削除したことにより、1行目に記述した
<%= render "users/users", user: @user %>が機能しなくなってしまった。
おそらく過去の僕は
- posts#show内で@user変数を用意
- render内でuser変数に代入
- 現ユーザの情報を取得して表示
させようと思ったのだろう。
でも、@userを使うとエラーが出るので、それは出来ないということらしい。
では何をrenderのuser変数に入れれば良いのか...
写真を投稿したuserデータを表示するには…
悩むこと1時間...
ん?
写真を投稿したuser情報...あ!
ピキーン
こいつを入れればもしかして...(5行目を@user→@post.userに変更)
無事表示できました。よかった。
【番外編(ちょっと愚痴)】
今回のエラーは結構苦戦したので、私は序盤で現役エンジニアの方(メンター)に相談したのですが、最初の相談で「このコードでは表示できませんね〜、ここを見てください」と解説リンク貼り付けで一蹴されました。
ど素人から言わせてもらえば、自分で調べても解決しなかったから他人(メンター)に助けを求めたのに、それを「もっと自分で調べろ!(=自分でなんとかしろ!)」っていうのはどうなんだろうと思いました。いやまぁ自己解決能力を上げるのも大切ですが、こちらはお金を払って聞いている訳なので、その対応はちょっとね…と若干怒りモード入りました。
メンター選びは大切ですね。