layout宣言とは
Railsは現在のレイアウトを検索するときに、最初に現在のコントローラと同じ基本名を持つレイアウトがapp/views/layoutsディレクトリにあるかどうかを調べます。たとえば、PhotosControllerクラスのアクションからレンダリングする場合は、app/views/layouts/photos.html.erb(またはapp/views/layouts/photos.builder)を検索します。コントローラ固有のレイアウトが見つからない場合は、app/views/layouts/application.html.erbまたはapp/views/layouts/application.builderを使います。.erbレイアウトがない場合は、builderレイアウトがあればそれを使います。Railsには、個別のコントローラやアクションに割り当てる特定のレイアウトをより正確に指定する方法がいくつも用意されています。
layout宣言
コントローラ用のレイアウトを指定する。既存のレイアウトのルールはlayout宣言で上書きすることができる。
例えば、
class ProductsController < ApplicationController layout 'inventory'
通常、Productsという名前と同じ基本名を持つレイアウトを探すが、layout宣言によりinventoryが指定されているので、inventory.html.erbがレイアウトとして用いられる。
アプリケーション全体で特定のレイアウトを使いたい場合は、layoutをApplicationControllerクラスで宣言する。
class ApplicationController < ActionController::Base layout 'main'
この宣言により、アプリケーション全てのビューでapp/views/layouts/main.html.erbレイアウトが使われるようになる。
管理画面課題の例
ベースとなるAdmin::BaseControllerではadmin/layouts/application.html.erbをレイアウトとして用いる。
class Admin::BaseController < ApplicationController before_action :check_admin layout 'admin/layouts/application'
Admin::BaseControllerを継承しているAdmin::UserSessonControllerでは読み込むファイルの関係でログイン画面用のレイアウトを用いるためlayout宣言でさらに上書きされている。
class Admin::UserSessionsController < Admin::BaseController skip_before_action :require_login, only: %i[new create] skip_before_action :check_admin, only: %i[new create] layout 'layouts/admin_login'
↑ちなみになんで管理者用ログインページなのに、admin配下に置かないのか
ログイン画面に関してはログインしていない状態のため、まだ管理画面ではないという解釈に基づき、admin配下ではないlayouts配下に置かれているとのこと。
管理用ログイン画面も管理画面に関する画面と解釈するならばviews/admin/layouts/配下に置く。