Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
56
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

render先に変数が上手く渡らないときに確認すること

render時の変数はパラメーター渡しが基本

パラメーターを指定することで部分テンプレートの使い回しができます

index.html
= render 'template', group: @group
= render 'template', group: @gp
= render 'template', group: data

collectionで渡すと勝手にeachして、asで指定した変数に入れてくれます
変数名の指定はシンボルでも""でも可

index.haml
= render partial: 'template', collection: @group, as: :group
= render partial: 'template', collection: @group, as: 'group'
= render partial: 'template', collection: @gp, as: :group

ちなみにcollectionは何も指定しないと、eachされた変数は参照先テンプレートの名前になります

index.haml
= render partial: 'template', collection: @groups
_template.haml
%p #{template.name}



以下renderで変数が渡らなかったとき、意外とその原因が潜む場所が多いなと思ったのでメモ

部分テンプレート名とインスタンス変数が違う

localsとobjectは何も指定しないと部分テンプレート名の変数に入ります
collectionの場合はeachされたものが部分テンプレート名の変数に入ります

index.haml
= render partial: 'groups', collection: @groups
= render partial: 'groups', locals: @groups
= render partial: 'groups', object: @groups
_groups.haml
%p #{group.name}

この場合であれば#{groups.name}にする、もしくはファイル名を_group.hamlにする

partialだけを省略していないか?

locals: object: collection:partial:とセットで使う
あるいは、@変数の中身が1つの場合は本記事冒頭に記載の両方省略形にする

index.haml
= 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しないといけない

index.haml
= render partial: 'template', locals: {group: @groups}
= render partial: 'template', object: @groups, as: :group
_template.haml
- group.each do |g| 
  %p #{g.name}

なので配列の時はcollectionで渡す

@変数だけで渡している場合

参照先は同じディレクト下の@変数単数形の部分テンプレート
@変数はeachされて部分テンプレート名に入る

groups/index.haml
= render @groups
groups/_group.haml
%p #{group.name}


同じ部分テンプレートを別の場所でもrenderしていないか?

どこを修正してもエラーがなおらない!!
そんな時は別の場所で同じ部分テンプレートをrenderしている可能性あり

index.haml
.contents
  %h1 人気のグループ
  = render partial: 'sample', collection: @groups, as: :group

= render 'sample2'
= render 'sample3'

.contents
  %h1 人気のアーティスト
  = render 'sample'  ◀︎◀︎◀︎◀︎ ここだ〜〜〜!!




参考文献

Qiita [Rails] 部分テンプレート使用時のrenderの書き方
書籍 Ruby on Rails 5アプリケーションプログラミング

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
56
Help us understand the problem. What are the problem?