Ruby On Rails PR

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

Railsの部分テンプレートの書き方をコード付きで解説!引数の渡し方やディレクトリ名の悩みとはおさらば!
記事内に商品プロモーションを含む場合があります

Railsの開発において、同じデザインや構造を持つ画面要素を効率的に管理するための機能として部分テンプレートがあります。

しかし、その作成や管理、引数の渡し方については、初めての方には少し戸惑う部分もあるでしょう。

この記事では、部分テンプレートの基本的な使い方から、より高度な活用方法までを詳しく解説します。

本記事の内容

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

部分テンプレートとは?

部分テンプレートは、共通のHTML構造を一つのファイルにまとめ、必要なページからそのファイルを呼び出して表示する仕組みです。

これにより、コードの再利用性が向上し、開発の効率化やメンテナンスの容易さが実現します。

部分テンプレートの具体的な利用方法について、次のセクションから詳しく見ていきましょう。

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

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

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

部分テンプレートを格納するディレクトリでよく見かける命名として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を使って部分テンプレート呼び出す際にはファイル名の先頭にある_は記述が不要という点に注意しましょう。

今回で言うと部分テンプレートのファイル名は_form.html.erbですが、formと記述しています。

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

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のコードのメンテナンス性を向上させる事が出来ます。

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

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