ham-capのブログ

プログラミング学習の記録

【Rails】配列を一覧表示したいだけならeachを使う必要はない

Railsで何らかの一覧画面を表示させたい場合、コントローラーから渡ってきた配列からeachを使って要素を取り出してパーシャルに渡す方法しかないと思っていた。 (*今回は各インスタンスの個別の情報を表示する部分をパーシャルとして切り出している前提。)

例えばユーザーの一覧を作るときなら以下のような感じ。

 - @users.each do |user|
    = render 'user', user:

しかし、実はこんなことをしなくても以下のように書けば同様の結果が得られる。

= render @users

この場合、renderは引数で渡された変数名の単数系と同名のパーシャル(今回ならviews/users/_user.html.slim)を探して自動的にレンダリングしてくれる。

また、その際は@usersから取り出した各要素をローカル変数としてパーシャルに渡すところまでやってくれる。

つまり、何らかのオブジェクトの配列から各要素を取り出して単純にレンダリングするような場合、同名の(単数系の)パーシャルさえ用意すればわざわざeachを使って繰り返し処理を書く必要がないので、冗長な記述を避けられる。

これに関連して、Railsガイドには以下の記載もあり、配列の中に異なるモデルのインスタンスがある場合であっても、対応するパーシャルさえあればそれぞれのモデル名と一致するパーシャルを選択してレンダリングしてくれるとのこと。

ここで使われるパーシャル名は、コレクションのモデル名に基いて決定されます。 実は、一様でない(種類の異なるメンバーを含む)コレクションでも上の方法が使えます。この場合、コレクションのメンバーに応じて適切なパーシャルが自動的に選択されます。

<h1>Contacts</h1>
<%= render [customer1, employee1, customer2, employee2] %>

この場合だと、インスタンスが属するモデルによってviews/customers/_customer.html.erbviews/employees/_employee.html.erbのいずれかが選択される。

実際に種類の異なるインスタンスを含んだ配列を使う機会がどれぐらいあるかはわからないが、Railsの親切心がよく伝わってくる挙動だなと思った。