Railsでコントローラのアクションごとにレイアウトを出し分ける方法
株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい
また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。
前提
Ruby on Railsは、application.html.erb
がデフォルトのレイアウトファイルになります。しかし、アプリケーションを開発していると、以下のような場面でレイアウトファイルを出し分けたいということがあります。
- 通常の画面ではヘッダーやフッターを表示するレイアウトを利用したい
- 利用規約やプライバシポリシー画面では、ヘッダーやフッターを表示しないレイアウトを利用したい
- 同じコントローラーでも利用者の一覧画面と利用者の詳細画面では違うレイアウトを利用したい
本記事ではレイアウトファイルをControllerのアクションごとに出し分けたい場合の方法について記述していきます。
コントローラーごとにレイアウトファイルを変更する
特定のコントローラーではヘッダーやフッターの表示をしたくないという場合は、コントローラー内でlayout 'レイアウトファイル名'
を記述します。
具体例として、プライバシポリシーや利用規約を表示するためのコントローラーpages_contoller.rb
で、ヘッダーやフッターを表示しないno_header_footer.html.erb
というレイアウトを表示したい場合には、以下のように記述します。
class PagesController < ApplicationController
# 以下の1文を記述
layout 'no_header_footer'
def privacy
end
end
アクションごとにレイアウトファイルを変更する
特定のコントローラーのアクションごとにレイアウトファイルを変更したい場合。
例えば、プライバシーポリシーページではヘッダーやフッターを表示しないレイアウトファイル、利用規約ではフッターだけを表示しないレイアウトファイルを利用したい場合には、コントローラー内で以下のように記述します。
class PagesController < ApplicationController
def privacy
render layout: 'no_header_footer'
end
def terms
render layout: 'no_footer'
end
end
ちなみに以下のように設定することもできます。
class PagesController < ApplicationController
#ここを追加
layout :change_layout
def privacy
end
def terms
end
private
#ここを追加
def change_layout
case action_name
when 'privacy'
'no_header_footer'
when 'terms'
'no_footer'
end
end
end
これは何をしているかというと、change_layout
メソッドの中で、アクション名によってlayout
メソッドに渡す引数を変更するようにしていることになります。
Discussion