Rails layout と application.html.erbを共通化する方法
はじめに
Railsのアプリケーション開発では、見た目やレイアウトを統一したい場面が多いのではないでしょうか。
たとえば、画面上部のナビゲーションやページ下部のフッターを毎回書くのは手間ですし、部分的に修正が出たときにすべてのページを直すのは大変です。
Railsにはlayout機能が用意されていて、application.html.erbというファイルを利用することで全ページで共通化された外観を実現できます。
しかし、layoutは単に画面の見た目を統一するだけでなく、複数の異なるデザインを使い分けたいときや、一部のページだけに特別な構成を施したいときなど、さまざまな状況で役に立ちます。
本記事では、Railsのlayoutとapplication.html.erbをどのように共通化すればいいのか、具体例を交えながら分かりやすく説明していきます。
初心者の方にも理解しやすいように、基本的な設定手順や実務での活用例まで幅広くカバーしますので、ぜひ参考にしてください。
この記事を読むとわかること
- Railsにおけるlayoutの概要と役割
- application.html.erbの基本的な構造と使い方
- yieldやcontent_forを使った効率的な共通化方法
- partialでヘッダーやフッターを使い回す実装アイデア
- 複数レイアウトを使い分けるポイントと実務での活用例
- layoutをうまく活用するための注意点
Railsにおけるlayoutとは
Railsアプリケーションで同じ見た目を多くのページに反映させたいときに役立つのがlayoutです。
layoutファイルにはHTMLのベース構造をまとめておき、コンテンツ部分をyield
で差し込む仕組みが一般的です。
たとえば全ページに共通するヘッダーやフッター、サイドバーなどをlayoutにまとめておくと、コードの重複を大幅に削減できます。
加えて、複数のレイアウトを用意しておけば、管理画面用・ユーザー向け画面用といった使い分けも簡単になります。
こうした柔軟性から、Railsプロジェクトではlayoutを利用することがほぼ当たり前と言えるでしょう。
layoutを使うメリット
レイアウト機能を使うことで得られる主なメリットは以下のとおりです。
コードの重複を減らす
多くの画面で同じコードを書くのは手間ですが、layoutにまとめておくと一括管理しやすくなります。
デザインの変更が容易
レイアウトファイルを修正するだけで全ページの変更が完了する場合が多く、保守が楽になります。
複数のテーマを簡単に切り替えられる
コントローラごとに別のlayoutを指定すれば、管理画面やユーザー向け画面など異なる見た目を柔軟に使い分けられます。
このようにlayoutは、複数のファイルにまたがる共通要素を効率的に扱うために不可欠な存在です。
一度しっかり理解しておくと、Rails開発の生産性が大きく向上します。
application.html.erbの基本
Railsを新規に作成すると、app/views/layouts/application.html.erb
というファイルが自動生成されます。
これは初期設定で全コントローラに適用される共通レイアウトファイルとして扱われます。
application.html.erb
の中身はシンプルなHTML構造で始まることが多く、<head>
タグや<body>
タグを持ち、その中に<%= yield %>
を含む形です。
この<%= yield %>
の部分に、各ビューが描画する内容が差し込まれる仕組みになっています。
body内でのyieldの役割
yield
は、コントローラがレンダリングする各アクションのビューを差し込む場所です。
基本的にlayoutファイルは、全ページで共通して使いたいヘッダーやフッターをHTML上で囲み、その中にyield
をはさむイメージです。
たとえば以下のような構造が一般的です。
<!-- app/views/layouts/application.html.erb --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>My Rails App</title> </head> <body> <header> <!-- ヘッダー部分(ナビゲーションなど) --> </header> <%= yield %> <footer> <!-- フッター部分 --> </footer> </body> </html>
Railsにおけるyield
はとても重要です。
ここを中心に、各ビューのコンテンツが差し込まれることで、同じHTML構造の中で異なるページを表示できるようになります。
ヘッダーやフッターの差し替えをどう行うか
全ページで同じヘッダーやフッターを使い回すなら、直接application.html.erb
の中に書いておく方法がわかりやすいです。
ただし、部分的に共通化したい場合や、さらに構造を整理して保守性を高めたい場合は、後述するpartialを活用すると便利になります。
ヘッダーやフッターだけ別ファイルに切り出して、それを<%= render partial: "shared/header" %>
のように呼び出すアプローチを使えば、規模が拡大しても管理が楽になるでしょう。
ひとまず、application.html.erbにあるyield
の役割がページ内容の差し込みであることを押さえておけば、Railsのレイアウト構造の基礎がつかめます。
content_forを活用して細かな差異をコントロールする
layoutの中で細かいカスタマイズが必要になるケースがあるかもしれません。
たとえば、ページごとに違うタイトルやメタタグをセットしたい場合や、特定ページでしか使わないスクリプトを読み込みたい場合などが該当します。
そこでよく使われるのがcontent_forメソッドです。
content_for
を使うと、特定のブロックで定義した内容を、layoutファイル内の任意の場所に差し込むことができます。
content_forの基本的な使い方
具体的には、以下のような流れで利用します。
- ビュー側で
content_for :キー名 do ... end
を使い、任意の情報を定義する - layoutファイル(あるいは別のビュー)で
<%= yield :キー名 %>
を置いた場所に、先ほど定義した情報を埋め込む
例として、各ページでタイトルをカスタマイズする場合のコード例を見てみましょう。
<!-- app/views/layouts/application.html.erb --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><%= content_for?(:title) ? yield(:title) : "デフォルトタイトル" %></title> </head> <body> <%= yield %> </body> </html>
<!-- app/views/articles/index.html.erb --> <% content_for :title do %> 記事一覧ページ <% end %> <h1>記事一覧</h1> <!-- 以下、記事の一覧を表示 -->
このようにyield(:title)
を使うことで、コントローラのアクションごとに柔軟にタイトルを変えられます。
同様のやり方でメタタグやJavaScriptファイル、CSSなどを差し込みたい場合にもcontent_for
はよく使われます。
partialを利用して共通要素をさらに整理する
layoutファイルが長くなると、読みやすさが下がったり、変更時の影響範囲が見通しにくくなったりすることがあります。
そこで登場するのがpartialです。
Railsでは、名前の先頭にアンダースコア(_)を付けたファイルをpartialとして扱い、テンプレートを再利用する仕組みを提供しています。
partialの具体例
ヘッダーやフッターをそれぞれ別ファイルに切り出して、application.html.erb
から読み込む方法を考えてみましょう。
たとえばapp/views/layouts/_header.html.erb
というファイル名でヘッダー部分を切り出すとします。
<!-- app/views/layouts/_header.html.erb --> <nav> <!-- ナビゲーションバーのHTML --> </nav>
これをapplication.html.erb
から呼び出すには、たとえば以下のように書きます。
<!-- app/views/layouts/application.html.erb --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>My Rails App</title> </head> <body> <%= render "layouts/header" %> <%= yield %> <%= render "layouts/footer" %> </body> </html>
フッターも同様に_footer.html.erb
を用意して、render "layouts/footer"
で呼び出します。
こうすることで、ヘッダーやフッターのロジックが分離され、メンテナンス性が向上します。
それぞれの更新内容が他の部分に影響を及ぼしにくい構造になるため、共同開発や規模拡大にも対応しやすい形になります。
partialでデータを受け渡す
partialにはローカル変数を渡す方法もあります。
たとえばヘッダーでユーザー情報を表示したいときには、render "layouts/header", user: @current_user
のように書き、partial内でuser
変数を使うことが可能です。
これにより、layoutとビューの間で必要な情報をスムーズにやりとりできます。
複数レイアウトを使い分ける
共通化とは言え、アプリケーション内で複数の異なるレイアウトを使いたい場面は少なくありません。
たとえばフロントユーザー向けの画面と管理者向けダッシュボードで大きくUIが異なる場合、layoutファイルを分けておくと管理がしやすくなります。
コントローラ単位でlayoutを指定する
Railsでは、コントローラのクラス内でlayout "ファイル名"
を指定すれば、そのコントローラが利用するレイアウトを自由に変えられます。
以下は例です。
# app/controllers/admin/base_controller.rb class Admin::BaseController < ApplicationController layout "admin" # 管理画面の共通機能を定義 end
そして、app/views/layouts/admin.html.erb
を作成しておけば、Admin::BaseController
を継承するコントローラすべてがそのレイアウトを使います。
こうすると、管理画面専用のデザインを簡単に切り分けることができるでしょう。
アクション単位でlayoutを指定する
より柔軟に、アクションごとに異なるレイアウトを使い分けたいこともあるかもしれません。
その場合はlayout
メソッドにブロックを渡して、アクション名を条件分岐して返す実装が可能です。
class ArticlesController < ApplicationController layout :choose_layout def index # 一覧ページ end def special # 特別なレイアウトを使いたい end private def choose_layout if action_name == "special" "special_layout" else "application" end end end
このようにコードを書くと、special
アクションだけ別のレイアウトを適用できます。
複数レイアウトをうまく使い分けることで、ページの多様なデザイン要求にも対応できます。
実務でlayoutを活用するシーン
実務では、とにかくデザインがコロコロ変わることがよくあります。
クライアントの要望やプロジェクトの進捗状況によって、ヘッダーの文言や色合い、フッターに入れるクレジットなど、細かな修正が頻繁に発生するものです。
layout機能によって、こうした修正が一か所の編集で全ページに反映されるのは便利です。
複数のレイアウトを用意し、用途ごとに切り替える仕組みを事前に整えておくと、大規模開発になってもページ数や機能が増えたときにパニックになりにくくなります。
特に、管理画面ではログイン機能やサイドバー、ダッシュボードなど、ユーザー向けとは全く違うレイアウト要素が必要になる場合があります。
そうしたケースでは、app/views/layouts/admin.html.erb
やapp/views/layouts/user.html.erb
といったように複数のレイアウトを作るのがおすすめです。
layoutとpartialを組み合わせた保守性の高い設計
部分的に同じ要素をさらに共通化したい場合は、partialを併用すると保守性がぐっと高まります。
たとえば管理画面と一般ユーザー向け画面で共通するフッターの下部コピーライト表記などは、_footer.html.erb
にまとめておき、それぞれのlayoutから呼び出すようにするのがスッキリした実装です。
同様にヘッダーやサイドメニューでも、管理画面とユーザー画面の一部が似ているなら、共通部分をpartialに切り出したうえで、管理画面用とユーザー向けにロゴや配色だけ分ける方法が考えられます。
レイアウト間でも大枠は別だけれど、一部のパーツは共有したいという場面では、partialの存在がとても役立ちます。
複数のlayoutを運用するときには、共通化すべきパーツと個別実装すべきパーツを切り分ける設計が重要です。
予想以上に複雑になりすぎないよう、まずはよく使うパーツをpartialにまとめるのがおすすめです。
便利なヘルパーやレイアウト関連メソッド
layoutをうまく使いこなすうえで、Railsが用意している便利なメソッドや仕組みを押さえておくとさらに開発がスムーズになります。
以下のようなものが代表的です。
renderヘルパー
render
は部分テンプレート(partial)の呼び出しだけでなく、別のレイアウトを一時的に使ってビューを描画する場合にも利用できます。
必要に応じてrender(layout: "other_layout") { ... }
のような書き方をすることも可能です。
これはあまり頻繁に使うケースではありませんが、単一アクション内で別レイアウトを明示的に指定したいときに役立ちます。
before_actionやhelper_method
コントローラ内で共通的に使うインスタンス変数やメソッドを定義しておくと、layoutファイルでの表示制御に使いやすくなります。
たとえば、ログインユーザーが管理者かどうかを判定し、それによってレイアウト内のメニュー項目を出し分けたい場合などが典型的です。
よくあるトラブルと対処方法
レイアウトを使う際に起こりがちなトラブルや疑問点も、あらかじめ理解しておくとスムーズです。
部分テンプレートが読み込めない
render "layouts/header"
の記述が正しくても、ファイル名やフォルダ構成が誤っているとエラーになります。
Railsはデフォルトでapp/views/
ディレクトリ配下を探しますので、ディレクトリ名やファイル名に誤りがないか確認しましょう。
layoutが意図せず切り替わっている
複数のlayoutを定義している場合、コントローラやメソッドでのlayout
設定に気づかず、別レイアウトが適用されることがあります。
必要であれば、コントローラ内でlayout nil
を設定するとレイアウトそのものを使用しない動作を確認できるので、原因を切り分けるのに便利です。
yieldが複数ある場合の動き
レイアウト内にyield
を複数置くことも一応可能ですが、どこにどんなコンテンツが入るのか混乱しないように注意が必要です。
視覚的に明確な目的があってyield
を複数使う場合以外は、content_for
で細分化するのがより安全です。
layoutやpartialを頻繁に変更すると、各コントローラやビューの関連付けにミスが生じやすくなります。
設定の変更は段階的に行い、誤動作したらすぐ戻せるようバージョン管理を徹底しておくと安心です。
実務目線でのフォルダ構成アイデア
Railsである程度の規模感を持った開発をしていると、レイアウトやパーツが数多く作られる傾向があります。
そこで、以下のようにapp/views
の下を少し整理すると運用しやすいです。
app/views/layouts/application.html.erb
- メインのレイアウトファイル
app/views/layouts/admin.html.erb
- 管理画面用のレイアウトファイル(必要に応じて増やす)
app/views/layouts/_header.html.erb
- ヘッダーパーツ
app/views/layouts/_footer.html.erb
- フッターパーツ
app/views/shared/*
- コントローラに依存しない共通部品(例えばモーダルウィンドウなど)
このように用途ごとにフォルダを分けておくことで、レイアウト関連のファイルが増えても衝突や混乱を起こしにくくなります。
特に共同開発では、命名や配置ルールをチーム内で統一しておくと後から参画した人も分かりやすくなるでしょう。
layout共通化のポイントを押さえて効率的なRails開発を
ここまで解説してきたように、Railsのlayoutとapplication.html.erbを活用することで、ページ全体のデザインや構造を簡単に共通化できるようになります。
さらに、partialやcontent_for
を組み合わせれば、細かな違いにも対応しやすくなります。
特に実務での大規模開発では、複数のレイアウトを使ったり、一部のみをpartialとして共通化したりといったパターンが頻出します。
こうした工夫を事前に仕込んでおくことで、保守コストを抑えながら開発をスピードアップできるのです。
まとめ
Railsアプリケーションにおいて、layoutは見た目や構造を大きく左右する重要な仕組みです。
application.html.erb
を中心に、yield
とcontent_for
、そしてpartialを上手に使いこなせば、重複コードの削減やデザイン修正のしやすさを実感できるでしょう。
以下のポイントを改めて整理しておきます。
layoutの基本
Railsではapplication.html.erb
がデフォルトレイアウトとして扱われ、各ビューの内容はyield
に差し込まれる
複数レイアウトの活用
管理画面などで別のデザインが必要な場合は、コントローラやアクション単位でレイアウトを切り替える
partialと組み合わせる
ヘッダーやフッター、共通パーツをpartialとして分割し、レイアウトをすっきり保つ
content_forで柔軟な差し込み
タイトルやメタタグなど、ページごとに微妙に変えたい要素にcontent_for
を利用する
これらの使い方に慣れておけば、要件が変化しやすい現場でも素早く対応できます。
ぜひ実際のアプリケーションでlayoutやpartialを取り入れ、保守しやすいRailsプロジェクトを実現してみてはいかがでしょうか。