使い方1
xxx.html.erb
<%= @user.name %>
<%= @user.email %>
<%= @user.age %>
xxx.html.erb
<%= render partial: 'hoge', locals: {user: @user} %>
_hoge.html.erb
<%= user.name %>
<%= user.email %>
<%= user.age %>
※ 書き方:<%= render partial: 'ファイル名', locals: { '部分テンプレート内で使う変数': '変数に入れる値' } %>
※ ファイル名は、render記載のファイルと同じディレクトリにある_hoge
ならhoge
。
※ localsオプションを使った場合はpartialは省略できない。
※ partialを省略したいならlocalsオプションも省略しないといけない
(例:<%= render 'hoge', user: @user %>
)
※ メリット:コードがスッキリする。部分テンプレートを使いまわせるから便利&コードの保守性が上がる。
使い方2
xxx.html.erb
<% @users.each do |user| %>
<%= user.name %>
<%= user.email %>
<%= user.age %>
<% end %>
xxx.html.erb
<% @users.each do |user| %>
<%= render partial: 'user', user: user %> #使い方1と同じ
<% end %>
_user.html.erb
<%= user.name %>
<%= user.email %>
<%= user.age %>
※ @usersの要素の個数分、部分テンプレートが呼び出されて表示される。
collectionオプションを使うと、下記のように__each文を省略__できる。
xxx.html.erb
<%= render partial: 'user', collection: @users %>
_user.html.erb
<%= user.name %>
<%= user.email %>
<%= user.age %>
※ 書き方:<%= render partial: 'hoge', collection: 繰り返し表示する要素が入っているインスタンス %>
※ collectionオプションの部分にeachで回したかった変数を入れる
※ collectionに指定した変数の要素の分だけ部分テンプレートが繰り返し表示される
※ collectionオプションを使用した場合、partialで指定したファイルの名前がそのまま部分テンプレート内で使用する変数名になる。
もし別の名前として変数を使いたい場合は`as`に変数名を指定する
<%= render partial: 'user', collection: @users, as: "hoge" %>
_user.html.erb
<%= hoge.name %>
<%= hoge.email %>
<%= hoge.age %>
※ @usersに入っている要素が一つずつ取り出され、部分テンプレート_user.html.erb
内の変数hoge
に代入される。
※ 上のコード(asは除く)は以下の条件を全て満たしている時、省略できる。
・ viewsフォルダ内にあるusers
フォルダに部分テンプレート_user.html.erb
が存在する
・部分テンプレート内で使う変数がuser
である
まとめると、views/hoges/_hoge.html.erb
内で変数hoge
を使っていることが省略の条件
なので、
<%= render @users %>
と書けば、上述したeach文
とcollection
記法と意味は同じ
#3つとも意味は同じ
xxx.html.erb
<%= render @users %>
<% @users.each do |user| %>
<%= render partial: 'user', user: user %>
<% end %>
<%= render partial: 'user', collection: @users %>
users/_user.html.erb
<%= user.name %>
<%= user.email %>
<%= user.age %>
※ 3つとも意味は同じだがパフォーマンス(実行速度)が変わってくるので注意
each文の中にrender入れる VS collectionオプションを使う
eachで表示すると@users
などに入っている要素の個数回分部分テンプレートが呼び出されるが、collectionオプションを使用して記述すると部分テンプレートが呼び出されるのは1回のみ。
なので、eachで表示するよりもcollectionオプションを使う方がパフォーマンスが良くなる。
部分テンプレートを繰り返し呼び出す時はなるべくeach文ではなくcollectionオプションを使うようにする。