indexを表示するときなどビューテンプレート内でeachを使うことはよくあると思います。
Railsにはeachを書かなくても、部分テンプレートを使って同じ要素を複数回表示させることができるメソッドが備えられています。
eachを使って書く
例としてユーザーを表にして表示する場合を考えてみます。
下のようなコントローラがあった場合、
def index
@users = User.all
end
次のようにeachを使って表を生成することができます。
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
<% end %>
コレクションを部分バーシャルを使ってレンダリングする
renderメソッドを使うと部分パーシャルを使って繰り返しを表現できます。
<%= render partial: "user", collection: @users %>
部分パーシャルを用意します。
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
renderメソッドのcollectionオプションにコレクションを指定すると、要素の数の回数、部分パーシャルをこの位置に埋め込みます。
部分パーシャル内のローカル変数はパーシャルの名前に基づいた名前になります。
パーシャルの名前をclientに変更すると
<%= render partial: "client", collection: @users %>
部分パーシャル内のローカル変数はclientになります。
<tr>
<td><%= client.name %></td>
<td><%= client.email %></td>
</tr>
コレクションに指定した変数の単数形になるわけではないので注意が必要です。
また、collectionオプションを付けるときは、partialを省略することができません。
パフォーマンスの悪い書き方
<% @users.each do |user| %>
<%= render "user", user: user %>
<% end %>
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
コレクションを使わずに部分テンプレートを繰り返し表示してしまうとパフォーマンスが悪くなります。
部分テンプレートを繰り返し呼び出す時はcollectionオプションを使う記述にしましょう。
略記法
<%= render @users %>
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
renderメソッドの引数にコレクションを渡すと要素のモデル名からパーシャル名が推測されます。
さいごに
この記事の筆者はプログラミングを学習し始めたばかりの初心者です。間違いがあれば指摘していただけると幸いです。