りゅうじの学習blog

学習したことをアウトプットしていきます。

パーシャル(部分テンプレート)をrenderでcollectionオプションで呼び出す

こんにちは、りゅうじです。

 

こちらは 昨日書いたlocalsオプション  の記事です。知らない方は合わせて読んでみてください。

https://ryujisurf55.hatenablog.com/

render をパーシャルで呼び出す際に

collectionオプション という繰り返しパーシャルをレンダリングするものです。

まずcollectionメソッドを使用しなかったとき

locals の時と同様のコントローラーに 今回は@hogesインスタンス変数を定義されている状態で(複数のデータを代入している為に @hoges と複数形な事に注意)

#_hoge.html.erb
<%= hoge.name %>
<%= hoge.title %>
<%= hoge.boby %>

この部分テンプレートを下記のビューファイルに呼び出します。

#viewファイル
<% @hoge.each do |hoge| %>
  <%= render partial: 'hoge', hoge: hoge %>
<% end %>

上記のコードは @hoges の要素の分だけ部分テンプレートが繰り返し呼び出して表示されます。

この3行のコードを1行で書けるのが

collectionオプション です。

collectionオプションの省略しない記述

#viewファイル
<%= render partial: 'hoge', collection: @hoges %>

1行で書いていますが同じ動きをします。

こちらもパーシャルにはローカル変数を定義し、 renderメソッド の中でインスタンス変数 @hoge を定義する事で、この他のviewファイルでも使用可能な仕様になっています。

省略した記述

#viewファイル
<%= render partial: 'hoge', collection: @hoges %>

ここから三つの条件全てを満たしていると、かなり省略して記述できます。

  • 呼び出す部分テンプレートがviewsフォルダ内にあるhogesフォルダに存在する
  • 部分テンプレート名が_hoge.html.erbである
  • 部分テンプレート内で使う変数がhogeである
#viewファイル
<%= render @hoges %>

え?これでいいの?ってなりましたよね。いいのです。やりすぎな程の省略なので省略していない方をまずは覚えましょう!

最後に

読んで頂いた方、ありがとうございました。