SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Railsによるクライアントサイド開発入門

Rails 7で簡単にCSSフレームワークを導入! Tailwind CSSとBootstrapを活用したチュートリアルで学ぶ

Railsによるクライアントサイド開発入門 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Bootstrapアプリを作成する

 ここからは、CSSフレームワークとしてBootstrapを使用する例を紹介します。Bootstrapの説明は必要最小限になりますので、詳細は下記を参照してください。

 Bootstrap

土台のアプリケーションを作成する

 まず、土台となるRailsアプリケーションを作成します。作成するアプリケーションは、第3回で紹介したもの(jsbundling-rails+esbuild+React)と同様です。Bootstrapを使う場合、esbuildの使用も強制される点に注意です。また、アセットパイプラインにPropshaftは使えないので(アプリケーションの作成時にエラーとなります)、デフォルトのSprocketsを指定しています。

% rails new bootstrap_app -a sprockets -c bootstrap --skip-hotwire

 アプリケーション作成時に、「Add ~」で始まるメッセージが2個、それぞれ緑色と赤色で表示されますので、package.jsonファイルに追記します。このうち緑色の方には、指示される内容に--loaderオプションを加えてください(第3回と同様です)。

リスト package.json
{
  "name": "app",
  "private": "true",
  "dependencies": {
    "esbuild": "^0.14.38"
  },	←ここから第3回で追記
  "scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --loader:.js=jsx"
    "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"	←今回追記
  }
}

 今回追記した内容は、CSSファイルのコンパイルのために実行されるbuild:cssコマンドです。実際に実行するコマンドはsassで、BootstrapのSCSSファイルをCSSファイルにコンパイルします。

[NOTE]package.jsonへの追記

 ここでは、package.jsonファイルへの追記を手動で行いましたが、Rails 7.0.3.1以降では自動で追記されます。この場合は、"build": "esbuild…"へのloaderオプションの追加のみを行ってください。

[NOTE]sassc-railsライブラリ

 ここでは、Gemライブラリsassc-railsを使用します。このライブラリは、CSSファイル中のurl関数で画像等のアセットファイルの参照があった場合、ダイジェストを付加したファイル名に変換してくれます。Propshaftでは標準で処理してくれましたが、Sprocketsでは明示的にライブラリを有効にする必要があります。アプリケーション作成直後、Gemライブラリ「sassc-rails」を有効にして(Gemfile内のコメントアウトを解除して)、bundle installコマンドを実行しておいてください。

 第3回の内容も含めてアプリケーションが作成できたら、Bootstrapを設定する前に実行しておきましょう。実行は、bin/devコマンドです。初期状態では、かなり素っ気ない見た目となります。

図 初期状態のBootstrapアプリケーション
図 初期状態のBootstrapアプリケーション

アプリケーションの構成を見てみる

 フロントエンド関連のファイルがいくつか生成されています。多くは第3章で紹介済みですが、Bootstrapのインストールとアプリケーションの実行によって生成された、あるいは改変されたファイルに絞ってここで見ておくことにしましょう。

bootstrap_app
├── app
│   └── assets … アセットファイルを置くフォルダ
│        ├── builds … ビルドされたアセットが置かれるフォルダ
│        │   └── application.css … ビルドされたCSSファイル※
│        └── stylesheets … CSSファイルを置くフォルダ
│            └── application.bootstrap.scss … アプリケーション共通のスタイルシートソースファイル※
└── node_modules … Node.jsモジュールが置かれるフォルダ
     ├──  … 他は略
     ├── bootstrap … Bootstrapの本体
     └── bootstrap-icons … Bootstrap Iconsのファイル

 多くはesbuildを使った第3回におけるものと同様ですが、Bootstrapのインストールで注目すべきは※が付いた2箇所です。このうちapplication.bootstrap.scssには、アプリケーションで共通して使うスタイルを記述します。拡張子が.scssとなっていることから分かるように、SCSS(CSSのソース)形式でスタイルを記述します。

 そして、このファイルがビルドされた結果は、application.cssとして生成されます。この対応は、先ほどpackage.jsonに追記したbuild:cssコマンドの動作そのものです。なお、app/assets/stylesheets/application.cssは存在しません。Bootstrapのインストールによって削除されます。

 application.bootstrap.scssには、第3回で追記したものも含めて、Bootstrapの使用に必要ないくつかの文が記述されています。

リスト app/assets/stylesheets/application.bootstrap.scss
@import 'bootstrap/scss/bootstrap';			(1)
@import 'bootstrap-icons/font/bootstrap-icons';

body {							(2)
    background-image: url('pig2.png');
}

 (1)に、2つのimport文があります。それぞれが意味するところは、Bootstrap本体とBootstrap Iconsのインポートです。先ほどのpackage.jsonに追記したbuild:cssコマンドのオプションに--load-path=node_modulesがあるので、アプリケーションのnode_modulesフォルダ相対となります。

 さらに、(2)は画像ファイル(pig2.png)をbody要素に指定するスタイルを追記したものです。SCSS形式では、素のCSSはそのままの形で記述できます。

 とりあえず、(1)の2つの文だけでBootstrapを使う下地はできています。しかし、Tailwind CSSとは異なりレイアウトファイルもビューファイルも特にクラスは設定されていません。このため、Bootstrapのリブート設定が適用されます。この設定による見た目は先ほどの図のように素っ気ないものなので、見た目を整えるには、クラスを追加したり、独自にスタイルを記述したりしていく作業が必須となります。

[NOTE]Bootstrapのリブート設定

 リブート設定とは、ブラウザ間の見た目上の相違が最小になるようにBootstrapが既定で設定したスタイルです。同じタグ内容でも、第3回のサンプルとは見た目が異なるはずですから比較してみてください。

レイアウトを変えてみる

 既定のレイアウトに簡単に手を入れて見た目を整えてみましょう。行うのは2点、アプリケーション共通のレイアウトをTailwind CSSの既定に近づけること、メッセージ「こんにちは やまうちなお さん!」をアラート表示することです。まずは、共通レイアウトの設定です。application.html.erbにmain要素を追加し、クラスを追加します。

リスト app/views/layouts/application.html.erb
<main class="container mx-auto mt-5 px-4 d-block">	←追加
  <%= yield %>
</main>							←追加

 クラスの種類と命名については、Tailwind CSSとよく似ています。containerとmx-autoについては同じ意味になりますが、mt-*やpx-*の「*」部分の数値の意味はまったく異なります。

  • mt-5:上方向マージン(margin top)。この場合は3rem。
  • px-4:横方向パディング(padding x)。この場合は1.5rem。
  • d-block:子要素にブロックレイアウトを指定。

 そして、メッセージ「こんにちは やまうちなお さん!」の見た目の変更です。hello.html.erbにある2つめのdiv要素をさらにdiv要素で囲んで、Bootstrapのアラートコンポーネントで配置します。

リスト app/views/react/hello.html.erb
<div class="alert alert-info d-flex">
  <div class="bi-heart-fill me-1"></div>
  <div id="app"></div>
</div>

 追加したクラスの内容は以下の通りです。

  • alert、alert-info:アラートコンポーネント(情報)の指定。
  • d-flex:アラート内の配置をFlexboxレイアウトに。
  • bi-heart-fill:Bootstrap Iconsのアイコンの指定(塗りつぶしたハート)。
  • me-1:右マージンを0.25remにしてメッセージとの間隔を調整。

 Bootstrapは豊富なコンポーネントの提供が特徴でもありますので、そのひとつであるアラートを使用してみました。また、Bootstrap Iconsが利用可能になっていますので、アイコンも挿入しています。

 Pumaサーバを起動して、図のようなページが表示されれば成功です。

図 完成したBootstrapアプリケーション
図 完成したBootstrapアプリケーション

まとめ

 今回は、cssbundling-railsを使ってCSSフレームワークを導入する過程を通じて、これらのライブラリの目的と機能について紹介しました。次回は、HotwireでSPAライクなアプリを開発するサンプルを紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Railsによるクライアントサイド開発入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16385 2022/09/16 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング