部分テンプレート(パーシャル)まとめ
パーシャルとは?
partial…部分的
部分テンプレートのこと
renderメソッドは指定したテンプレートを呼び出す際に使うメソッド。
通常下記の様に記述する。
render 'ファイル名' render :アクション名
部分テンプレを使って呼び出していることを明示的にする際は、下記のようにpartialオプション
を用いて記述することもできる。
render partial: 'ファイル名' # 異なるディレクトリ内の部分テンプレを呼び出す際はこの書き方!! render partial: 'ディレクトリ名/ファイル名'
※partialオプションは部分テンプレであることを強調する目的のため付けなくても問題はないが、localesオプション
、collectionオプション
を使用したい時は付けないとエラーが出る。
localesオプション
部分テンプレ内で使う変数を定義することができる。部分テンプレ内で変数を使いたいときはどこかに変数を定義する必要がある。そんな時にlocalesオプションを使って変数を定義することができる。
def index @posts = Post.all end
<% @posts.each do |post| %> <%= render partial: 'post', locales: { post: post } %> <% end %>
↑
locales: { post: post }の最初のpost
はパーシャル内で使われている変数、二つ目のpost
は変数の値であり、each文の繰り返し処理で得られたpostsの内の一つ
。
これが部分テンプレート内で使いたい変数をlocalesオプション
に定義するということ。
_post.html.erb
投稿内容<%= post.body %>
↑パーシャル内で使われている変数post
collectionオプション
指定した変数の要素の分だけ部分テンプレが繰り返し表示される。
<%= render partial: '', collection: @posts %>
collectionオプションを使う理由、また何故each文ではダメなのか
_post.html.erb
<%= post.title %> <%= post.body %>
投稿一覧を表示するとき、何となく@postsを繰り返し処理して表示させたくなる
index.html.erb
<% if @posts.present? %> <% @posts.each do |post| %> <%= render partial: 'post', locales: { post: post } %> <% else %>
↑の処理では_post.html.erb
というパーシャルを繰り返し表示する。パーシャル内ではlocalesオプション
で示したpost
という変数に繰り返し文で回した|post|の値を入れたものを利用する。
もちろんこの処理でも投稿一覧を表示することはできるが、レンダリングも実装に気を付けなければパフォーマンスの悪化に繋がる。
erbやhamlで書かれたテンプレファイルをHTMLに変換する処理は負荷がかかる動作であり、極力無駄なレンダリングは避けるべき
collectionオプションで以下のように省略
<% if @posts.present? %> <%= render partial: "post", collection: @posts %> <% else %>
指定した要素(collection: @posts)の分だけパーシャルが繰り返し表示される。
collectionオプションを使わないeach文の書き方だと、@postsの数だけパーシャルがレンダリングされる形になる。上述した通り、何度もレンダリングすることでHTMLに変換する際、必要以上の負荷がかかってしまう。
collectionオプションを渡すことで一度でレンダリングすることができる。
さらに省略・・・
collectionオプションを用いたレンダリングには省略記法がある。
コントローラ
@posts = Post.all.includes(:user).order(created_at: :desc) # N+1問題対策でincludesメソッド使用
↑
取得したオブジェクトをそのままレンダリングする
↓
post.html.erb
<% if @posts.present? %> <%= render @posts %> <% else %>
このように書いても同様の処理が行われる。
参考にしたサイト
Rails パーシャル(部分テンプレート)へローカル変数を渡したいとき - Qiita
【Ruby on Rails】パーシャルを使ったビューの共通化 | プログラミングマガジン
パーシャルを使って掲示板一覧を表示する - Ruby on Rails Learning Diary