Rails Diary

プログラミングの学習記録です。

部分テンプレート(パーシャル)まとめ

パーシャルとは?

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】パーシャルを使ったビューの共通化 | プログラミングマガジン

【Rails】パーシャルを利用する - Qiita

パーシャルを使って掲示板一覧を表示する - Ruby on Rails Learning Diary

【Rails】 部分テンプレートの使い方を徹底解説! | Pikawaka

レイアウトとレンダリング - Railsガイド