68
56

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 5 years have passed since last update.

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

Last updated at Posted at 2018-06-11

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の書き方](https://qiita.com/kojiro3/items/4ce52494a4e69bc443a2) 書籍 [Ruby on Rails 5アプリケーションプログラミング](https://www.amazon.co.jp/Ruby-Rails-5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774188832)
68
56
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
68
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?