プログラミング初心者の勉強メモ。

あくまでメモなので、自分が忘れそうなことだけちょこちょこ書いてます。

link_toが機能しない!

posts#show(PostsControllerのshowアクション)からview/posts/show.html.erbを表示させたい。

ということでまず、rails routeのコマンドでリンク先のurlを取得

f:id:over54:20200714004118p:plain

左列のPrefix(○○_pathと入力することでリンク先へ飛べるメソッド)を使うと、「posts#show(PostsControllerのshowアクション)からview/posts/show.html.erbを表示させるには、"post"を使え」と書いてある。つまり、"post_path(インスタンス変数)"いうメソッドを使えばリンクを飛ばせるよ、ってことらしい。

そこで12行目に以下のメソッドを入力。

f:id:over54:20200714010221p:plain

するとエラーが発生する。

ここは本題からそれるので概要だけ話すと、(ルーティング設定時に自動で生成されるリンクメソッドである)○○_pathを使ってリンク先を書く時に、定義をしていない@post(コントローラーで作る変数)を使うこと自体おかしいらしい。 

なので今度は8行目に記載した<%= @posts.each do |post| %>で全てのポスト(全投稿データ)をそれぞれ1つずつ表示するメソッドを記入しているので、そのそれぞれ1つずつの意味を表す変数postをリンク先の変数として入れた。

(12行目のコードがpost_path(@post)からpost_path(post)にしたということ)

f:id:over54:20200714010358p:plain

でもエラー。

f:id:over54:20200714010757p:plain

なぜか。

それは、私がリンク先を表示するために作ったPostsControllerのshowアクションに原因があったのだ。
エラーコードとして出ているが、postsテーブルからid:13の投稿データを取得したいのに、@user = User.find[params(:id)]も記述したことにより、usersテーブルからid:13のユーザ情報も取得しようとしてしまったことで「おい、13人目のユーザ(id:13を持つユーザ)なんて見つけられねーぞ!」とお叱りを受けてしまったのだ。

ということで、この1文(@user = User.find[params(:id)])を削除。

 

f:id:over54:20200714013505p:plain

f:id:over54:20200714014042p:plain

にしました。

が、また再チャレンジするとエラー。

f:id:over54:20200714011750p:plain

原因はposts/show.html.erbの5行目に記述したrender内の変数を設定するところ。

(user: @userの部分)

f:id:over54:20200714013204p:plain

今度は@user変数を削除したことにより、1行目に記述した

<%= render "users/users", user: @user %>が機能しなくなってしまった。

おそらく過去の僕は

  1. posts#show内で@user変数を用意
  2. render内でuser変数に代入
  3. 現ユーザの情報を取得して表示

させようと思ったのだろう。

でも、@userを使うとエラーが出るので、それは出来ないということらしい。

では何をrenderのuser変数に入れれば良いのか...

写真を投稿したuserデータを表示するには…

悩むこと1時間...

ん?

写真を投稿したuser情報...あ!

ピキーン

こいつを入れればもしかして...(5行目を@user→@post.userに変更)

f:id:over54:20200714132907p:plain

無事表示できました。よかった。

 

【番外編(ちょっと愚痴)】

今回のエラーは結構苦戦したので、私は序盤で現役エンジニアの方(メンター)に相談したのですが、最初の相談で「このコードでは表示できませんね〜、ここを見てください」と解説リンク貼り付けで一蹴されました。

ど素人から言わせてもらえば、自分で調べても解決しなかったから他人(メンター)に助けを求めたのに、それを「もっと自分で調べろ!(=自分でなんとかしろ!)」っていうのはどうなんだろうと思いました。いやまぁ自己解決能力を上げるのも大切ですが、こちらはお金を払って聞いている訳なので、その対応はちょっとね…と若干怒りモード入りました。

メンター選びは大切ですね。