Ruby On Rails PR

Railsでrender collectionを使う方法とメリットを解説!変数名を変更したい場合はasを使う

Railsの部分テンプレートでcollectionを使う方法とメリットを解説!collectionは積極的に使うべき?
記事内に商品プロモーションを含む場合があります

Ruby On Railsでは部分テンプレートを活用する事で、画面に関するファイルの再利用性を高め、メンテナンス性も飛躍的に向上させる事が可能です。

しかしこの部分テンプレートを活用して繰り返しデータを表示する場合には、パフォーマンスを悪化させている可能性があるので注意が必要です。

そこで今回の記事では部分テンプレートを活用する際に利用出来るcollection (コレクション)について解説をしていきます。

この記事を読んでコレクションについて理解することで、画面にデータを表示するだけでなく、パフォーマンスも意識した書き方を出来るようになりましょう。

本記事の内容
  • コレクションの使い方
  • コレクションを使うメリット
  • コレクションに渡す変数名を変更する方法

部分テンプレートの書き方について

部分テンプレートの書き方については下記の記事にまとめてあるので、引数の渡し方や省略記法が曖昧になってしまっている方は確認しておきましょう。

Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!
Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!Railsの開発において、同じデザインや構造を持つ画面要素を効率的に管理するための機能として部分テンプレートがあります。 しかし、その...

部分テンプレートにおけるcollectionとは

collectionと言うとActiveRecordのCollectionが最初に浮かんでくる方もいると思いますが、今回紹介するのは部分テンプレートを表示するために活用するrendercollectionになります。

部分テンプレートを表示する際に活用出来るrenderメソッドにはオプションとしてcollectionという記述が可能です。

このcollectionを記述することにより、データを繰り返し表示するような場所でeachを使わずに記述することが可能になります。

collectionの使い方

今回はユーザーの一覧画面(index.html.erb)で下記の_user.html.erbの部分テンプレートを使い繰り返しデータを表示するケースを例にします。

@usersの変数はUserControllerのindexメソッドで定義されているものとします。

_user.html.erb

<%= user.name %>
<%= user.age %>

collectionを使わない書き方

index.html.erb

<% @users.each do |user| %>
  <%= render 'user', user: user %>
<% end %>

eachを活用することで@usersに格納されているUserインスタンスを1つずつ取りだしuserに格納。そしてuserを部分テンプレートに渡しています。

部分テンプレートを指定する際にpartial: ‘user’の様に記述する場合は、変数をlocals{}で囲わないと上手く変数が渡せないので注意しましょう。部分テンプレートの詳しい呼び出し方については下記の記事を参照ください。

Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!
Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!Railsの開発において、同じデザインや構造を持つ画面要素を効率的に管理するための機能として部分テンプレートがあります。 しかし、その...

collectionを使った書き方

index.html.erb

<%= render partial: 'user', collection: @users %>

collectionオプションの値として@usersを渡すことで、内部で要素を1つずつ取り出して処理してくれています。

この際に部分テンプレートに渡る変数名はpartialで指定した値(今回でいうとuser)になるという点を覚えておきましょう。

collectionオプションを使う場合はpartialを明示的に記載しないとエラーが出るので注意しましょう

collectionの省略記法を使えるケース

collectionは下記の全ての条件を満たしている場合に省略記法を使うことが可能です。

collectionの省略記法が使える条件
  • 部分テンプレートが呼び出し元のテンプレートと同じディレクトリ内にある
    • index.html.erb_user.html.erb(部分テンプレート)が同じディレクトリにある
  • 部分テンプレートのファイル名がオプションで指定した変数の単数形である
    • オプションで指定した変数名が@usersであれば、部分テンプレートは_user.html.erbである
  • 部分テンプレート内で使用する変数名が、オプションで指定した変数の単数形である
    • オプションで@usersを渡したなら、部分テンプレート内で使用する変数名がuserである

上記を満たしていた場合には、下記のような省略した形式での記述が可能になります。

index.html.erb

<%= render @users %>

この省略記法を利用すると、collectionという単語すら入力が不要となります。

変数名を変更したい場合はasを使う

collectionを利用した際には、partialで指定したファイル名が部分テンプレートに渡る変数名になると前の項目で解説しました。

そのため、例えば部分テンプレート名が_hoge_user.html.erbで、renderのオプションとしてpartial: ‘hoge_user’を記述した場合には、部分テンプレートで利用できる変数名はhoge_userになります。

_hoge_user.html.erb

<%= hoge_user.name %>
<%= hoge_user.age %> 

上記の様に自動で決まる変数名を利用したくない場合には、asオプションを活用することで変数名の変更が可能です。

index.html.erb

<%= render partial: 'hoge_user', collection: @users, as: 'user' %>

collectionを使うメリット

collectionを使うメリットは大きく分けて2つあります。

テンプレートを呼び出す回数が削減出来る

最初に紹介したこちらのコードではループ回数分の部分テンプレート呼び出し処理が行われます。

index.html.erb

<% @users.each do |user| %>
  <%= render 'user', user: user %>
<% end %>

そのためレコードの件数が多ければ多いほど部分テンプレート呼び出し処理に時間がかかり、パフォーマンス(描画速度)は悪化していきます。

しかし下記のようにcollectionを活用した場合には、部分テンプレートの呼び出しは1回に抑えられるので、レコードの件数が増えたとしても部分テンプレートを呼び出すための処理時間は変化しません。

index.html.erb

<%= render partial: 'user', collection: @users %>

よりシンプルにわかりやすいコードを書く一歩になる

rendercollectionは部分テンプレート利用時にしか使えないため、まずは部分テンプレートを使うところから始まります。

部分テンプレートを活用する事で、viewファイルの再利用性を高めメンテナンス性も向上させてくれるというメリットがあり、コードの質も高まりやすいです。

どの様に部分テンプレートを活用して行くか、どこでcollectionを活用するべきかなどを考えながら、より良いコードを書いて行きましょう。

使える時は積極的にcollectionを使って行こう

collectionは単純にforeachで回さなくて良くなるだけでなく、パフォーマンスの恩恵や実装力を付けられると言ったメリットがあります。

少しでもより良いコードを書けるようにこういった細かい部分も意識しながら実装出来るようになりましょう。

> PR: Webエンジニア輩出実績トップクラスの【ポテパンキャンプ】

ABOUT ME
himakuro
新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、MENTAで未経験者の方にプログラミングを指導しています。
PR
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール