記事の目的
初学者の為、間違っているところはご指摘頂けると幸いです。
備忘録・アウトプット目的で投稿です。
部分テンプレートがよくわからない方は、こちらの記事がわかりやすいです。
https://pikawaka.com/rails/partial_template#collection%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3
##collecitonオプションでエラー
エラーの原因となるコードです。
= render partial: 'reviews/user_review', collection: @reviews
私の認識としては、@reviewsの要素のひとつひとつが以下の部分テンプレート先のreviewに代入されることを期待。しかし、以下のようにreviewが未定義とのエラーが出る。値が渡っていない。
ActionView::Template::Error (undefined local variable or method `review' for #<#<Class:0x00007fe1e3474948>:0x00007fe1df516738> Did you mean? @reviews):
= "#{review.purpose}"
##パーシャル先の変数を変更(解決策①)
調べると、ローカル変数は:partialで指定したものになる、とある。
今回でいうと、部分テンプレートに定義するのはreviewではなく、user_reviewでないといけない。
これで無事表示。
= "#{user_review.purpose}"
##パーシャル呼出するviewファイルでにて変数を指定(解決策②)
解決策①で述べたように、ローカル変数は:partialで指定したものが前提なのだが、ローカル変数を別の名前で使用したい場合はasオプションを使う、とある。
今回でいうと、部分テンプレート先で使う変数を当初設定したreviewとしたい場合は、以下のように呼出元のviewファイルにおいて、asオプションでreviewを指定します。
これで無事表示。
= render partial: 'reviews/user_review', collection: @reviews, as: "review"
##まとめ
最初の書き方だと、部分テンプレの名前の同名のものをviewファイルの変数として定義。
部分テンプレの名前じゃない変数を部分テンプレで使いたい場合は、asオプションで指定。