📑

Railsのパーシャルについてまとめる

2024/01/15に公開

パーシャルとは

Railsにおけるパーシャルとは、viewの一部をパーツ化し、再利用可能にしたものです。
viewを作る際に幾つかのviewで共通の処理を行うことがあると思います。
そんな時にパーシャルを用いると、共通の部分をテンプレートとして複数のviewで使い回すことができるようになります。
これにより全体のコード数を少なくすることができ、またメンテナンス性も向上します。

パーシャルの使用方法

パーシャルは基本は他のviewと同じhtml.erb形式ですが、名前の先頭に(_:アンダースコア)をつけるルールがあります。
例えば_comment.html.erbという名前で以下のようなパーシャルを定義します。

_comment.html.erb
<div class="comment">
  <p><strong>投稿者:</strong> <%= comment.author %></p>
  <p><%= comment.body %></p>
</div>

そしてこれをboard.html.erbから呼び出す際には以下のように記述します。

board.html.erb
<h1>掲示板</h1>

<% @comments.each do |comment| %>
  <%= render partial: "comment", locals: { comment: comment } %>
<% end %>

board.html.erbを解説すると、まずコメントモデルのコレクションを受け取り、その分ループさせています。
そのループの中でcommentという名前のパーシャルを呼び出し、commentモデルのインスタンスを渡している形になります。
次にcomment.html.erbですが、こちらはboard.html.erbからcommentモデルのインスタンスが渡されているため、そこからauthorとbodyをそれぞれ取得して表示しています。

パーシャルでコレクションをレンダリングする

上の例ではeach文を用いてループを行い、その中でパーシャルを呼び出すことで複数のコメントに対応していますが、コレクションをそのままrenderに渡すことでeachを用いずともコレクションの個数分パーシャルをレンダリングすることができます。
この場合、以下のように記述を行います。

board.html.erb
<h1>掲示板</h1>

<%= render partial: "comment", collection: @comments %>

また、@commentsに対応するパーシャルの名前がcommentのような単数形で定義されている場合、以下のように短縮して記載することもできます。

board.html.erb
<h1>掲示板</h1>

<%= render @comments %>

この記載でRailsは自動的に_comment.html.erbを探し出し、コレクションの個数分レンダリングしてくれます。

パーシャルにレイアウトを適用する

通常のviewにレイアウトを適用することができるように、パーシャルにもレイアウトを適用することができます。
レイアウトを適用することで、別のパーシャルに同一のフレームをつけるようなことを簡単に行うことができます。
レイアウトは以下のように定義します。

_comment_layout.html.erb
<div class="comment">
  <%= yield %>
</div>

commentクラスを持つdivで囲んでいるだけのシンプルなレイアウトです。
<%= yield %>の部分で以下のパーシャルを読み込みます。

_comment.html.erb
<p><strong>投稿者:</strong> <%= comment.author %></p>
<p><%= comment.body %></p>

そしてパーシャルを呼び出すboard.html.erbを以下のように記述することで、レイアウトの適用は完了です。

board.html.erb
<h1>掲示板</h1>

<%= render partial: "comment", layout: "comment_layout", locals: { comment: @comment } %>

パーシャルとしてcommentを指定し、レイアウトとしてcomment_layoutを指定することでレイアウトを適用できます。

最後に

パーシャルは同じ構造をさまざまな画面に適用したい場合に非常に便利なので、是非とも利用法を理解して使いこなせるようになりましょう!

Discussion