Ruby on Rails

【Ruby on Rails】レイアウトファイルをコントローラやアクションで指定して切り替える方法まとめ

Railsでは特に指定しない場合、アプリケーション全体で同じレイアウトテンプレートが使用されます。しかし、Railsではレイアウトを柔軟に指定して扱うこともできます。コントローラやアクション毎にレイアウトを指定してレンダリングする方法をまとめてみました!

Railsでレイアウトファイルをコントローラやアクションで指定して切り替える方法まとめ

Railsのレイアウトファイルの基本的な使い方

ページのヘッダーやフッターなど、共通な枠組みはパーツに切り分けるのがキレイなコードに繋がります。Railsでは共通の枠組みを記述したファイルを「レイアウトファイル」と呼び、app/views/layoutsに置きます。

特に指定しない場合アプリケーション全体で同じレイアウトファイルapp/views/layouts/application.html.erbが使用されます。しかし、Railsではコントローラやアクション毎に簡単に切り替えることもできます。

今回は、以下に記載する4つの方法をご紹介します!

  1. コントローラ毎に使用するレイアウトを自動設定する方法
  2. 複数のコントローラからファイル指定してレイアウトを設定する方法
  3. アクション毎に適用するレイアウトファイルを切り替える方法
  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

また、exceptonlyを指定することでアクション単位での制御も行うことができます。

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

-Ruby on Rails