🌊

Railsでコントローラのアクションごとにレイアウトを出し分ける方法

2022/12/25に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

Ruby on Railsは、application.html.erbがデフォルトのレイアウトファイルになります。しかし、アプリケーションを開発していると、以下のような場面でレイアウトファイルを出し分けたいということがあります。

  • 通常の画面ではヘッダーやフッターを表示するレイアウトを利用したい
  • 利用規約やプライバシポリシー画面では、ヘッダーやフッターを表示しないレイアウトを利用したい
  • 同じコントローラーでも利用者の一覧画面と利用者の詳細画面では違うレイアウトを利用したい

本記事ではレイアウトファイルをControllerのアクションごとに出し分けたい場合の方法について記述していきます。

コントローラーごとにレイアウトファイルを変更する

特定のコントローラーではヘッダーやフッターの表示をしたくないという場合は、コントローラー内でlayout 'レイアウトファイル名'を記述します。

具体例として、プライバシポリシーや利用規約を表示するためのコントローラーpages_contoller.rbで、ヘッダーやフッターを表示しないno_header_footer.html.erbというレイアウトを表示したい場合には、以下のように記述します。

app/controllers/privacy_controller.rb
class PagesController < ApplicationController
  # 以下の1文を記述
  layout 'no_header_footer'

  def privacy
  end
end

アクションごとにレイアウトファイルを変更する

特定のコントローラーのアクションごとにレイアウトファイルを変更したい場合。
例えば、プライバシーポリシーページではヘッダーやフッターを表示しないレイアウトファイル、利用規約ではフッターだけを表示しないレイアウトファイルを利用したい場合には、コントローラー内で以下のように記述します。

app/controllers/pages_controller.rb
class PagesController < ApplicationController
  def privacy
    render layout: 'no_header_footer'
  end

  def terms
    render layout: 'no_footer'
  end
end

ちなみに以下のように設定することもできます。

app/controllers/pages_controller.rb
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