Railsでは特に指定しない場合、アプリケーション全体で同じレイアウトテンプレートが使用されます。しかし、Railsではレイアウトを柔軟に指定して扱うこともできます。コントローラやアクション毎にレイアウトを指定してレンダリングする方法をまとめてみました!
Railsのレイアウトファイルの基本的な使い方
ページのヘッダーやフッターなど、共通な枠組みはパーツに切り分けるのがキレイなコードに繋がります。Railsでは共通の枠組みを記述したファイルを「レイアウトファイル」と呼び、app/views/layouts
に置きます。
特に指定しない場合アプリケーション全体で同じレイアウトファイルapp/views/layouts/application.html.erb
が使用されます。しかし、Railsではコントローラやアクション毎に簡単に切り替えることもできます。
今回は、以下に記載する4つの方法をご紹介します!
- コントローラ毎に使用するレイアウトを自動設定する方法
- 複数のコントローラからファイル指定してレイアウトを設定する方法
- アクション毎に適用するレイアウトファイルを切り替える方法
- レイアウトを無効にする方法
1. コントローラ毎に使用するレイアウトを自動設定する方法
特に指定をしない場合、app/views/layouts/application.html.erb
ファイルが自動的に使用されます。しかし、柔軟に設計されているRailsはapp/views/layouts/コントローラ名.html.erb
のファイルが存在すると、自動的にそのレイアウトを使用してくれます。
したがって、app/views/layouts/
にコントローラ専用のレイアウトファイルを作成するだけで、コントローラ単位でのレイアウトを切り替えができます。
2. 複数のコントローラからファイル指定してレイアウトを設定する方法
先ほどご紹介した1.の方法ではコントローラ毎にレイアウトファイルを生成しなければならず、もし複数コントローラで共通のレイアウトを使う場合には不便です。
そのような場合には、共通するレイアウトを作成しコントローラからそのレイアウトを指定して切り替える方法があります。この方法を使うことで、レイアウトの共通化ができリファクタリングにも繋がります。
設定の仕方は簡単で、まずapp/views/layouts/共通レイアウト名.html.erb
を生成し、そのレイアウトを使用するコントローラに以下の1行を追加するだけです。
class HogesController < ApplicationController
layout '共通レイアウト名'
def アクション名
end
end
また、except
やonly
を指定することでアクション単位での制御も行うことができます。
class HogesController < ApplicationController
layout '共通レイアウト名' except: [:new, :edit]
# layout '共通レイアウト名' only: [:new, :edit]
def show
end
def new
end
def edit
end
end
3. アクション毎に適用するレイアウトファイルを切り替える方法
アクション単位で指定する場合は、そのアクションの中でrender
メソッドを呼ぶことで実現できます。具体的には、以下の用に記述します。
class HogesController < ApplicationController
def hoge
render layout: 'レイアウトファイル名`
end
end
4. レイアウトを無効にする方法
ヘッダーやフッターなどが必要なくただ単純にアクション部分のレイアウトを出力したい場合、レイアウトを無効にすることができます。コントローラ毎でもアクション毎でも、一行追加するだけで簡単にレイアウトを無効にできます。
コントローラ毎にレイアウトを無効にする場合、コントローラに以下を記述
class HogesController < ApplicationController
layout false
def hoge
end
end
アクション毎にレイアウトを無効にする場合、コントローラのアクションに以下を記述
class HogesController < ApplicationController
def hoge
render layout: false
end
end
参考
コントローラやアクション毎に使用するレイアウトを切り替える - Ruby on Rails入門
Railsでビューのレイアウトを指定する - Rails Webook