render時の変数はパラメーター渡しが基本
パラメーターを指定することで部分テンプレートの使い回しができます
= render 'template', group: @group
= render 'template', group: @gp
= render 'template', group: data
collectionで渡すと勝手にeachして、asで指定した変数に入れてくれます
変数名の指定はシンボルでも""でも可
= render partial: 'template', collection: @group, as: :group
= render partial: 'template', collection: @group, as: 'group'
= render partial: 'template', collection: @gp, as: :group
ちなみにcollectionは何も指定しないと、eachされた変数は参照先テンプレートの名前になります
= render partial: 'template', collection: @groups
%p #{template.name}
以下renderで変数が渡らなかったとき、意外とその原因が潜む場所が多いなと思ったのでメモ
部分テンプレート名とインスタンス変数が違う
localsとobjectは何も指定しないと部分テンプレート名の変数に入ります
collectionの場合はeachされたものが部分テンプレート名の変数に入ります
= render partial: 'groups', collection: @groups
= render partial: 'groups', locals: @groups
= render partial: 'groups', object: @groups
%p #{group.name}
この場合であれば#{groups.name}
にする、もしくはファイル名を_group.haml
にする
partialだけを省略していないか?
locals:
object:
collection:
はpartial:
とセットで使う
あるいは、@変数の中身が1つの場合は本記事冒頭に記載の両方省略形にする
= render partial: 'groups/group', locals: { group: @group }
= render partial: 'groups/group', object: @groups
= render partial: 'groups/group', collection: @groups
locals
object
で配列を渡した時はeachしないといけない
勝手にeachしてくれるのはcollectionだけです
localsとobjectで渡された変数は配列のままなので参照先でeachしないといけない
= render partial: 'template', locals: {group: @groups}
= render partial: 'template', object: @groups, as: :group
- group.each do |g|
%p #{g.name}
なので配列の時はcollectionで渡す
@変数だけで渡している場合
参照先は同じディレクト下の@変数単数形の部分テンプレート
@変数はeachされて部分テンプレート名に入る
= render @groups
%p #{group.name}
同じ部分テンプレートを別の場所でもrenderしていないか?
どこを修正してもエラーがなおらない!!
そんな時は別の場所で同じ部分テンプレートをrenderしている可能性あり
.contents
%h1 人気のグループ
= render partial: 'sample', collection: @groups, as: :group
= render 'sample2'
= render 'sample3'
.contents
%h1 人気のアーティスト
= render 'sample' ◀︎◀︎◀︎◀︎ ここだ〜〜〜!!
参考文献
Qiita [Rails] 部分テンプレート使用時のrenderの書き方
書籍 Ruby on Rails 5アプリケーションプログラミング