【Rails】Tailwind CSS 導入〜使えるようになるまで《3分で完了》

Railsを使ったWebアプリの企画中、「イケてるUIのアプリにしたい！けど、Bootstrapはみんな使ってるから、なんかイヤだ...！」と思い、[Tailwind CSS](https://tailwindcss.com/)というCSSフレームワークをRailsに導入しました。
&emsp;

しかし、導入方法をGoogle検索すると、検索結果トップ記事それぞれで導入手順の解説内容がバラバラで、いったいどのやり方で導入すれば使えるようになるのかが分かりにくい...というのが現状です（実際、ボク自身も間違ったやり方で導入して、丸一日ムダにしてしまいました...）
&emsp;

そこで、「RailsへTailwind CSSを導入〜実際に使えるようになるまで」の実装手順をまとめました。
&emsp;
&emsp;
&emsp;

RailsへTailwind CSSを導入して使えるようになるまで手順説明は、次の内容でまとめました。
* 開発環境
* 実装の準備
* 具体的な実装内容 《本編》

「開発環境」では、本記事で解説する内容がローカル・本番（サービス：render・DB：PostgreSQL）の両方で正しく挙動したことを実際に視認できた環境を整理しました。「実装の準備」では、Tailwind CSSを導入する前段階で必要になるアプリの雛形の作成手順を整理しました。「具体的な実装内容《本編》」では、Tailwind CSS公式ドキュメントに則って、本記事のテーマとなる実装を、できる限り細かく解説しました。
&emsp;
&emsp;
&emsp;

# 開発環境

| Category       | Value,Version       |
| :------------: | :-----------------: |
| OS             | MacOS Sonoma 14.1.2 |
| Ruby           | 3.2.0               |
| Ruby on Rails  | 7.0.8               |
| Gem            | tailwindcss-rails   |
| Infrastructure | render              |

*Gem：Ruby専用拡張機能（Ruby用ライブラリ）
&emsp;
&emsp;
&emsp;

# 実装の準備
&emsp;

ここでは、Tailwind CSSの導入自体はおこなわず、アプリの雛形（トップページに`index.html.erb`の「Hello world!」を表示させるだけ）を作成します。
&emsp;

まず、アプリの土台をつくります。

```bash:Terminal
% rails _7.0.0_ new ◯◯◯（アプリ名） -d mysql  # "-d mysql"はお好みで

% cd ◯◯◯（アプリ名）

% rails db:create
```
&emsp;

次に、`config/database.yml`内の`encoding: utf8mb4` を`encoding: utf8`へ変更します。

```yml:database.yml
default: &default
  encoding: utf8
```
&emsp;

そして、トップページでビューファイルを表示させるために、ルーティングとコントローラーの設定を、次の順番で実装します。

```ruby:routes.rb
Rails.application.routes.draw do
  root "articles#index"
end
```
↓
```bash:Terminal
% rails g controller articles
```
↓
```ruby:articles_controller.rb
class ArticlesController < ApplicationController
  def index
  end
end
```
&emsp;

最後に、コントローラー生成と同時に`app/views/articles`ディレクトリへ自動生成された`index.html.erb`の中身を作成します。

```html:index.html.erb
<h1>Hello world!</h1>
```
&emsp;

ターミナルで`rails s`でサーバーを起動して`localhost:3000`へアクセスし、トップページに「Hello world!」と表示がされるかどうかを確認しましょう（確認できたら、サーバーを一旦落としましょう）
&emsp;
&emsp;
&emsp;

# 具体的な実装内容《本編》
&emsp;

それでは、Tailwind CSSをRailsへ実際に導入していく手順を、次の順番で説明します。
* 導入編
* オススメのデフォルト設定変更編
* 使いこなす編
&emsp;

## Tailwind CSS 《導入編》

まず、ターミナルで以下のコマンドを順に実行。
```bash:Terminal
% bundle add tailwindcss-rails

% rails tailwindcss:install
```
&emsp;

ターミナルに以下の表示が出れば、成功です。
```bash:Terminal
Add Tailwindcss include tags and container element in application layout
      insert  app/views/layouts/application.html.erb
      insert  app/views/layouts/application.html.erb
      insert  app/views/layouts/application.html.erb
Build into app/assets/builds
      create  app/assets/builds
      create  app/assets/builds/.keep
      append  app/assets/config/manifest.js
      append  .gitignore
Add default config/tailwindcss.config.js
      create  config/tailwind.config.js
Add default app/assets/stylesheets/application.tailwind.css
      create  app/assets/stylesheets/application.tailwind.css
Add default Procfile.dev
      create  Procfile.dev
Ensure foreman is installed
         run  gem install foreman from "."
Successfully installed foreman-0.87.2
Parsing documentation for foreman-0.87.2
Done installing documentation for foreman after 0 seconds
1 gem installed
Add bin/dev to start foreman
      create  bin/dev
Compile initial Tailwind build
         run  rails tailwindcss:build from "."
```
&emsp;

そして、事前準備で作成しておいた`index.html.erb`のh1タグのclass属性へ`"text-3xl font-bold underline"`という記述を追加します。
```html:index.html.erb
<h1 class="text-3xl font-bold underline">
    Hello world!
</h1>
```

&emsp;

最後に、`rails s`ではなく、`./bin/dev`というコマンドでサーバーを再起動します。

```bash:Terminal
％ ./bin/dev
```

[参考：「rails s」と「bin/dev」の違い](https://qiita.com/jnchito/items/5c41a7031404c313da1f#bindev-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)
&emsp;

これで、「Hello world!」がさっきと違う”イイ感じ”に表示されれば、導入は成功です :tada::tada::tada:
&emsp;

お疲れ様でした
&emsp;
&emsp;
&emsp;

## Tailwind CSS 《オススメのデフォルト設定変更編》
&emsp;

ここでは、RailsでTailwind CSSの記法を使ってCSS実装する前に済ませておくことをオススメするTailwind CSSのデフォルト設定変更を、いくつかまとめました。

* オススメ変更①：レイアウトテンプレートの変更
* オススメ変更②：フォントの変更
&emsp;

「CSSを正しく当ててるはずなのに、思い通りの表示が出ないぞ？」という違和感は、デフォルト設定が原因である場合も多いので、気になる方は設定変更してみてください。
&emsp;
&emsp;

### オススメ変更①：レイアウトテンプレートの変更
&emsp;

オススメ変更一つ目は「レイアウトテンプレートの変更」です。

具体的には、`application.html.erb` 内の `<main>` タグで囲んで付与されているデフォルトのCSS装飾をなくします。
&emsp;


`application.html.erb` ファイルを、次のように編集してください。
```html:application.html.erb

<!-- 変更前 -->

<!DOCTYPE html>
<html>
  <head>
    <title>（アプリ名）</title>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %>   <!-- ←より、Tailwind CSSが適用されていることがわかります -->
    
    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_importmap_tags %>
  </head>

  <body>
    <!-- <main>タグで囲んで付与されているデフォルトのCSS装飾 -->
    <main class="container mx-auto mt-28 px-5 flex"><%= yield %></main>   
  </body>
</html>
```
↓
↓
↓

```html:application.html.erb

<!-- 変更後 -->

<!DOCTYPE html>
<html>
  <head>    
    <!-- 〜〜省略〜〜 -->
  </head>

  <body>
    <!-- <main> タグを外して、<%= yield %> だけに -->
    <%= yield %>   <!-- <%= yield %>：body要素内に各viewファイルの記述を集約させるメソッド -->
  </body>
</html>
```
ブラウザで確認して問題がない、つまり基準位置、いわゆる「左上」に要素が来ていれば、「レイアウトテンプレート変更」完了です :tada:
&emsp;

「レイアウトテンプレート変更」の目的は、`<body>` 全体にかかっているCSS装飾をまっさらにすることで、位置や余白の基準をわかりやすくするためです。
&emsp;

たとえば、初期設定のままでは、画面幅に応じた最大横幅・上下左右の間隔・display: flex; ... などのCSS装飾が自動的に付与されています。

なので、このまま `index.html.erb` 等でviewファイルを生成しても、「左上」に要素が来ません。
&emsp;
なので、「レイアウトテンプレートの変更」は先におこない、余計なCSS装飾がかからないようにすることをオススメします。
&emsp;
&emsp;
&emsp;

### オススメ変更②：フォントの変更
&emsp;

オススメ変更二つ目は「フォントの変更」です。

具体的には、`tailwind.config.js` 内のフォント種に関するデフォルト設定をなくします。
&emsp;


`tailwind.config.js` ファイルを、次のように編集してください。
```javascript:tailwind.config.js

//変更前

const defaultTheme = require("tailwindcss/defaultTheme");

module.exports = {
  content: ["./public/*.html", "./app/helpers/**/*.rb", "./app/javascript/**/*.js", "./app/views/**/*.{erb,haml,html,slim}"],
  theme: {
    extend: {
      // フォント種に関するデフォルト設定　ここから...
      fontFamily: {
        sans: ["Inter var", ...defaultTheme.fontFamily.sans],
      },
      // ...ここまで消す
    },
  },
  plugins: [require("@tailwindcss/forms"), require("@tailwindcss/aspect-ratio"), require("@tailwindcss/typography"), require("@tailwindcss/container-queries")],
};
```
↓
↓
↓
```javascript:tailwind.config.js

//変更後

const defaultTheme = require("tailwindcss/defaultTheme");

module.exports = {
  content: ["./public/*.html", "./app/helpers/**/*.rb", "./app/javascript/**/*.js", "./app/views/**/*.{erb,haml,html,slim}"],
  theme: {
    extend: {
      // フォント種に関するデフォルト設定ナシ
    },
  },
  plugins: [require("@tailwindcss/forms"), require("@tailwindcss/aspect-ratio"), require("@tailwindcss/typography"), require("@tailwindcss/container-queries")],
};
```
ブラウザで確認して、問題がなければ「フォントの変更」完了です :tada:
&emsp;
&emsp;
&emsp;

### Tailwind CSS 《使いこなす編》
&emsp;

Tailwind CSSを自分の開発工程で自由自在に使いこなすためには、次のステップが必要です。
* Tailwind CSS独特の記法を覚える
* UIコンポーネントサイトを参照する
&emsp;

まず、Tailwind CSS独特の記法を覚える必要があります。
&emsp;

個人的には「チートシートを徹底的に活用する」と効率的に覚えられる実感があります。
[参考：Tailwind CSS Cheat Sheet](https://tailwindcomponents.com/cheatsheet/)
&emsp;

ちなみに、アプリの雛形をつくらないでただ挙動を確認したいだけなら、以下のサイトでチェックするのが便利です。
[参考：Tailwind Play](https://play.tailwindcss.com/)
&emsp;
&emsp;
次に、Tailwind CSSを使って実現できるUIを確認できるコンポーネントサイトもチェックしましょう。
&emsp;
個人的に使いやすいと感じるTailwind CSS用コンポーネントサイトを3つ共有しておきます。
* [オススメ①：Preline](https://preline.co/docs/)
* [オススメ②：HyperUI](https://www.hyperui.dev/)
* [オススメ③：Sailboat UI](https://sailboatui.com/docs/getting-started/quick-start/)
&emsp;
&emsp;
&emsp;

プログラミング学習のアウトプット、以上になります。
ご指摘あれば、お気軽にコメントください。
&emsp;
&emsp;
&emsp;

[参考 + 感謝：Install Tailwind CSS with Ruby on Rails（公式ドキュメント）](https://tailwindcss.com/docs/guides/ruby-on-rails)