Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!

3 min
Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!

Railsで同じ様な画面を作る時に部分テンプレートを活用するのが良いと聞きました。部分テンプレートを作る際のディレクトリやファイル名のルールなどはありますか?また部分テンプレートに引数を渡す方法なども教えてほしいです。

今回の記事ではこんな要望に答えていきます。

本記事の内容
  • 部分テンプレートのディレクトリやファイル名について
  • 部分テンプレートに引数(変数)を渡す方法
  • 部分テンプレートにおける省略記法
  • 部分テンプレート利用時の注意点

Webサービスを開発していると、複数の画面で全く同じ見た目のパーツを配置したりするケースがあります。

例としてはヘッダーやフッターなどがよくあるケースです。

そんな複数の画面に存在する要素を全てのファイルにHTML構造から記述していては、細かい変更を加えたくなった場合に全てのファイルを変更する必要があり非常に効率が悪いです。

そこで登場するのが部分テンプレートという仕組みです。

部分テンプレートとは、複数の画面で利用している同じHTML構造を1つのテンプレート(ファイル)にまとめて、そのHTML構造を表示したい画面ファイルからテンプレートを呼び出して表示しようという物です。

この部分テンプレートを活用することで画面のコードの再利用性が高まり、メンテナンス性が向上すると言ったメリットがあります。

今回の記事ではこんな便利な部分テンプレートの基本的な書き方を中心に解説し、利用時の注意点をまとめました。

部分テンプレートはRailsを使って開発をする際に必須の機能となるので、ぜひこれを機会に使い方をマスターしておきましょう。

部分テンプレートのディレクトリとファイル名

部分テンプレートのファイルを格納するディレクトリ名には決まったルールはなく、ファイル名にはルールがあります。

部分テンプレートのディレクトリの命名

部分テンプレートを格納するディレクトリでよく見かける命名としてsharedpartialの2つがあります。

部分テンプレートを格納するディレクトリ名はこの命名でなければ駄目という厳密なルールはありませんが、下記の2つの理由からsharedと言うディレクトリ名を使用するのが良いと思います。

部分テンプレートのディレクトリ名としてsharedを選ぶ理由

また1点補足としてsharedに入れる部分テンプレートは主にヘッダー、フッター、ナビゲーションバーなど、ほぼ全てのページで共通で使う部品を格納するケースが多いです。

逆に特定の機能だけにしか使わないテンプレート、例えば投稿画面でしか利用しない部分テンプレートであれば、下記の様にpostsディレクトリの中に入れてしまったほうが、どの様な画面で利用している部分テンプレートなのかが明確になるので良いです。

投稿に関する部分テンプレートを作成する場合
  • app/views/posts/new.html.erb
  • app/views/posts/edit.html.erb
  • app/views/posts/_form.html.erb ← newとeditで利用する部分テンプレート

部分テンプレートのファイル名

部分テンプレートのファイル名は基本的には自由に決められますが、先頭に「_」を付けると言うルールがあります。

OK: _header.html.erb
NG: header.html.erb

このルールを守らないとせっかく部分テンプレートを作っても呼び出すことが出来ないので注意しましょう

部分テンプレートの書き方・呼び出し方

各viewファイルから部分テンプレートを呼び出すためにはrenderというメソッドを利用します。

下記のコードはapp/views/usersのディレクトリに部分テンプレートである_form.html.erbがあり、その内容をnew.html.erbで読み込む場合の例になります。

app/views/users/new.html.erb


<%= render partial: 'form' %>

renderを使って呼び出す際にはファイル名の先頭にある_は記述が不要という点に注意しましょう。

部分テンプレートの省略記法

1つ前の項目で説明した方法よりも、よく利用されているのが下記の省略記法のパターンです。

app/views/users/new.html.erb


<%= render 'form' %>

このpartialを記述しない省略記法の方が実務でもよく使われるので積極的に活用していきましょう。

部分テンプレートに引数(変数)を渡す方法

部分テンプレートには引数を渡すことも可能です。

通常の記法で引数を渡す場合

まずは省略をしていない記法からです。

下記の例ではform(部分テンプレート)に対して@userというインスタンス変数をuserとして渡しています。

app/views/users/new.html.erb


<%= render partial: 'form', locals: { user: @user } %>

partialを省略せずに記述する場合は、localsというメソッドを記述して変数を{ }の中に記述します。

省略記法で引数を渡す場合

省略記法で引数を渡す場合はlocalsは記述出来ないので、下記の様になります。

app/views/users/new.html.erb


<%= render 'form', user: @user %>

引数を渡す場合でもこちらの省略記法の方がよく使われるので、この書き方に慣れておきましょう。

インスタンス変数は部分テンプレート内で参照しない

Controllerから返されたインスタンス変数を活用すれば、部分テンプレートに引数を渡す必要はないのでは?と思った方もいるかもしれません。

しかし部分テンプレート内でインスタンス変数を使ってしまうことにより、Controller側の処理に依存してしまい、再利用性が損なわれてしまいます。

部分テンプレート内ではインスタンス変数を使わず、引数としてインスタンス変数の値を渡すようにしましょう

部分テンプレートを使用して再利用性を高めよう

部分テンプレートを活用する事でViewのコードのメンテナンス性を向上させる事が出来ます。

どの様なコードを部分テンプレートとして切り出すべきかというのは若干の慣れが必要になりますが、実務でも必須のスキルとなるので、これを機会に部分テンプレートを実際に使って書き方だけでも慣れておきましょう。

Sponsored Link
himakuro

himakuro

新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、MENTAで未経験者の方にプログラミングを指導しています。

カテゴリー:
関連記事

コメントを残す