fv17の日記

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

【パーシャル】:collectionオプションによる複数オブジェクトのレンダリング

パーシャルにオブジェクトの複数形を渡し、見やすいコードにする

基本の使い方

collectionオプションにより、コレクションのメンバごとにパーシャルをレンダリングする

<%= render partial: "product", collection: @products %>

具体的な使い方

Before Refactor

<ul>
  <% @users.each do |user| %>
    <li>
      <%= link_to user.name, user %>
    </li>
  <% end %>
</ul>

After Refactor

<ul>
  <%= render partial: "user", collection: @users %>
</ul>

_user.html.erb

<li>
  <%= link_to user.name, user %>
</li>

Further refactor (さらにリファクタリング)

<ul>
  <%= render @users %>
</ul>

_user.html.erbには変更なし。

上記のように書くと、

  • Railsは @users をUserのオブジェクトであると認識
  • @users のメンバであるそれぞれの user オブジェクトを _user.html.erb に出力
  • パーシャル側では user 変数で user オブジェクトを参照できる

パーシャルにおいて、ローカル変数の名称を変更したい

パーシャル側で :collection オプションで渡されたオブジェクトに好きな名称を付けたい場合は :as オプション を使う

<ul>
  <%= render partial: "user", collection: @users, as: :owner %>
</ul>

上記により、パーシャルにおいて変数 owner で user オブジェクトを扱えるようになる。

_user.html.erb

<li>
  <%= link_to owner.name, owner %>
</li>