Ruby On Railsでは部分テンプレートを活用する事で、画面に関するファイルの再利用性を高め、メンテナンス性も飛躍的に向上させる事が可能です。
しかしこの部分テンプレートを活用して繰り返しデータを表示する場合には、パフォーマンスを悪化させている可能性があるので注意が必要です。
そこで今回の記事では部分テンプレートを活用する際に利用出来るcollection (コレクション)について解説をしていきます。
この記事を読んでコレクションについて理解することで、画面にデータを表示するだけでなく、パフォーマンスも意識した書き方を出来るようになりましょう。
- コレクションの使い方
- コレクションを使うメリット
- コレクションに渡す変数名を変更する方法
部分テンプレートの書き方について
部分テンプレートの書き方については下記の記事にまとめてあるので、引数の渡し方や省略記法が曖昧になってしまっている方は確認しておきましょう。
部分テンプレートにおけるcollectionとは
collectionと言うとActiveRecordのCollectionが最初に浮かんでくる方もいると思いますが、今回紹介するのは部分テンプレートを表示するために活用するrenderのcollectionになります。
部分テンプレートを表示する際に活用出来る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{}で囲わないと上手く変数が渡せないので注意しましょう。部分テンプレートの詳しい呼び出し方については下記の記事を参照ください。
collectionを使った書き方
index.html.erb
<%= render partial: 'user', collection: @users %>
collectionオプションの値として@usersを渡すことで、内部で要素を1つずつ取り出して処理してくれています。
この際に部分テンプレートに渡る変数名はpartialで指定した値(今回でいうとuser)になるという点を覚えておきましょう。
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 %>
よりシンプルにわかりやすいコードを書く一歩になる
renderのcollectionは部分テンプレート利用時にしか使えないため、まずは部分テンプレートを使うところから始まります。
部分テンプレートを活用する事で、viewファイルの再利用性を高めメンテナンス性も向上させてくれるというメリットがあり、コードの質も高まりやすいです。
どの様に部分テンプレートを活用して行くか、どこでcollectionを活用するべきかなどを考えながら、より良いコードを書いて行きましょう。
使える時は積極的にcollectionを使って行こう
collectionは単純にforeachで回さなくて良くなるだけでなく、パフォーマンスの恩恵や実装力を付けられると言ったメリットがあります。
少しでもより良いコードを書けるようにこういった細かい部分も意識しながら実装出来るようになりましょう。
- Ruby初心者に向けた学習ロードマップ!挫折しないための学習方法!
- 【初心者向け】MacでRailsを使えるようにするための環境構築方法を徹底解説!
- 【初心者向け】RailsでMySQLを使うための手順をコマンド付きで解説!
- Railsが難しい理由を現役エンジニアが解説!学習効率を上げるには○○を高めるべき!
- Rails初心者に向けたコマンドまとめ!newやgenerateコマンド、簡単に使える便利関数を紹介!
- Railsでルーティングを作成!ネストやパラメーターを取得する方法も解説!
- Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!
- Railsでリンクヘルパー(link_to)を使ってサクッとリンクを生成する方法を解説!