WeBlog

Webに関する情報を中心に発信してるブログ

レイアウトファイルのレンダリングを切り替える

レイアウトファイルとは?

レイアウトファイルは全てのビューファイルで大元にあたるファイルのことです。

# app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>

<head>
  <title><%= page_title(yield(:title)) %></title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>

  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= javascript_include_tag 'application' %>
</head>

<body>
  <% if logged_in? %>
  <%= render 'shared/header' %>
  <% else %>
  <%= render 'shared/before_login_header' %>
  <% end %>

  <%= render "shared/flash_message" %>

  <%= yield %>

  <%= render 'shared/footer' %>
</body>

</html>

上記のコードのように外部に切り出している「ヘッダー」や「フッター」をレンダーしたり、<%= yield %>で外部ファイルを読み込んでいるファイルのことを指します。

Railsはレイアウトファイルを探す場合、最初に現在のコントローラと同じ名前を持つレイアウトがapp/views/layoutsディレクトリにあるかどうかを調べます。

たとえば、PhotosControllerクラスのアクションから実行された場合は、app/views/layouts/photos.html.erbを探します。

app/views/layouts/photos.html.erbない場合、app/views/layouts/application.html.erbを探して使用します。

なので基本的にはapp/views/layouts/application.html.erbが使用されます。

しかし、app/views/layouts/application.html.erb以外を使用したい時があります。

そんな時どうするのかを記載します。

レイアウトファイルを変える方法

app
 |- /views
   |- /admin # 管理者用
     |- /dashboards
       |- /index.html.erb # ① 
   |- /layouts
     |- /application.html.erb # ③   
   |- /layouts # 一般ユーザー用
     |- /application.html.erb # ②

例えば上記のようにビューファイルの階層関係があったとします。

/views/admin配下・・・管理画面用ビューファイル

/views/layouts・・・一般ユーザー画面用ビューファイル

レイアウトファイルを変える記載をしない場合は、①のビューファイルは②のレイアウトファイルを使う形になります。

/views/layouts/application.html.erbがレイアウトファイルになります。

しかし、/views/admin/dashboards/index.html.erb管理画面のビューファイルです。

なので、一般ユーザーのレイアウトファイルと管理者用のレイアウトファイルは違いがあります。

違いというのは

・画面のデザインが違う(CSS

・読み込むJSファイルが違う

・一般ユーザー画面には必要だけど、管理者画面には必要無いものがある。(bodyタグの中が違う)

・一般ユーザー画面には必要無いけど、管理者画面には必要なものがある。(bodyタグの中が違う)

のような差異があるということです。

差異があるときに、レイアウトファイルを分けてあげます。

では、①から③をレイアウトファイルにするにはコントローラーの「このレイアウトファイルを使ってね」という記載します。

どのように記載するかは下記になります。

class Admin::DashboardsController < Admin::BaseController
    # レイアウトファイルを指定する
  layout 'admin/layouts/application'

  def index; end
end

1行目にlayout 'admin/layouts/application'という記載をしています。

これが、レイアウトファイルを変える記述です。

今回はviews/admin/layouts/application.html.erbをレイアウトファイルとして使いたいので、上記のような記載になります。

ちなみにAdmin::DashboardsControllerAdminという名前空間の中にある、DashboardsControllerという意味です。

このコントローラーのindexアクションが実行された場合は、/views/admin//dashboards//index.html.erbレンダリングされます。

https://railsguides.jp/layouts_and_rendering.html#レイアウトの探索順序

https://railsguides.jp/layouts_and_rendering.html#レイアウトの継承