🤖

Rails で 特定のページに別のレイアウト(デザイン)を指定する方法

2021/06/19に公開

始めに

ウェブアプリをつくっていると、それぞれのページでレイアウト(デザイン)を変更したいことがあります。
例えば、下層ページのデザインは共通で良いが、トップページだけは別のデザインにしたいといった場合です。

環境

% rails -v
Rails 6.1.1

% ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]

実装

Slimを使って効率的にhtmlを記述できるにします。
また、Sassを使って効率的にスタイルシートを書けるようにします。
そのために、Gemfileに以下を追記します。

# Gemfile
gem 'slim-rails'                     
gem 'sass-rails'

下層ページ全体

下層ページ全体で共通して使う スタイルシート application.scss は次のように書きます。

// app/assets/stylesheets/application.scss
@import 'header'; // ヘッダー用のscssを取り込みます。
@import 'footer';
// app/assets/stylesheets/_header.scss
// ヘッダー用のSCSSをいろいろ書きます。
header {
  background: yellow;
  color: red; 
}

ここで書いた スタイルシート application.scss は、下層ページ全体で使いたいので、
下層ページ全体で共通して使うレイアウトファイル application.html.slim に次のように書いて読み込みます。

/ app/views/layouts/application.html.slim
doctype html
html
  head
    meta charset="utf-8"
    / sprocket管理下のcssを読み込む
    / <link rel="stylesheet" href="app/assets/stylesheets/application.css">
    / と書くのと(だいたい)同じ意味です。
    = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'

  body
    / ヘッダーの内容は、下層ページ全体で共通なので、
    / app/views/layouts/_header.html.slim に 記しておき、表示させます。
    = render 'layouts/header'

    / 各ページ(index.html.slimやedit.html.slimなど)の内容がここに挿入される
    = yield
    
    / フッター
    = render 'layouts/footer'

    / 開発中のデバッグ情報を表示
    - if Rails.env.development?
      = debug(params)

/ app/views/layouts/_header.html.slim
header ヘッダー

一般的なウェブサイトでは、index.html を 次のような感じで書くかと思います。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <header>ヘッダー</header>
    内容いろいろ
    <footer>フッター</footer>
  </body>
</html>

上のレイアウトファイルと良く似ていることが分かるかと思います。

トップページ

トップページだけ、別のデザインにしたいときには、二つの方法があります。

1) トップページのコントローラ名と同じ名前のレイアウトファイルを用意する。

class TopController < ApplicationController
  def index
  end
end
// app/assets/stylesheets/top.scss
// (略)
/ app/views/layouts/top.html.slim
doctype html
html
  head
    meta charset="utf-8"
    / トップページ専用のscssを読み込みます。
    = stylesheet_link_tag 'top', media: 'all', 'data-turbolinks-track': 'reload'

  body
    / トップページ専用のデザインになるよう、slim(html)でいろいろ書きます。
    = yeild

2) layout メソッドで、適用するレイアウトファイル名を指定する

Welcome コントローラ だけれども、
使用するレイアウトファイル名は、top.html.slimを使いたいときには、
layout メソッドを使って、使用するレイアウトファイル名を指定します。

class WelcomeController < ApplicationController
  layout 'top'

  def index
  end
end

layout 'top' と書かなければ、

  1. welcome.html.slim があればそれを、
  2. なければ、application.html.slim のレイアウト(デザイン)になります。

参考

Rails を学ぶために、いろいろな書籍がありますが、次の順番で学んでいくと理解しやすいかと思います。

【初心者向け】
0. RubyとRailsの学習ガイド

  1. Railsの教科書

【中級者向け】
2. 現場で使えるRuby on Rails 速習実践ガイド
3. Ruby on Rails チュートリアル

【上級者向け】
4. Ruby on Rails 実践ガイド

また、Ruby on Rails ガイドも、Railsの個々の機能に関して詳しく説明が為されておりお薦めです。

皆様のご参考になれば幸いです。

Discussion