1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

部分テンプレート collectionオプションでundefined local variable or methodエラー

Last updated at Posted at 2020-10-01

記事の目的

初学者の為、間違っているところはご指摘頂けると幸いです。
備忘録・アウトプット目的で投稿です。

部分テンプレートがよくわからない方は、こちらの記事がわかりやすいです。
https://pikawaka.com/rails/partial_template#collection%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3

##collecitonオプションでエラー
エラーの原因となるコードです。

show.html.slim(部分テンプレートを呼出しているファイル)
= 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): 
_user_review.slim(部分テンプレート)
= "#{review.purpose}"

##パーシャル先の変数を変更(解決策①)
調べると、ローカル変数は:partialで指定したものになる、とある。
今回でいうと、部分テンプレートに定義するのはreviewではなく、user_reviewでないといけない。
これで無事表示。

show.html.slim(部分テンプレート)
= "#{user_review.purpose}"

##パーシャル呼出するviewファイルでにて変数を指定(解決策②)
解決策①で述べたように、ローカル変数は:partialで指定したものが前提なのだが、ローカル変数を別の名前で使用したい場合はasオプションを使う、とある。
今回でいうと、部分テンプレート先で使う変数を当初設定したreviewとしたい場合は、以下のように呼出元のviewファイルにおいて、asオプションでreviewを指定します。
これで無事表示。

show.html.slim(部分テンプレート)
= render partial: 'reviews/user_review', collection: @reviews, as: "review"

##まとめ
最初の書き方だと、部分テンプレの名前の同名のものをviewファイルの変数として定義。
部分テンプレの名前じゃない変数を部分テンプレで使いたい場合は、asオプションで指定。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?