Turbo Rails Tutorial を Rails 7.2.1 / ruby 3.3.5 / Dev Container / tailwindcss でやってみた (1)

15 minute read

mysql2のインストールにつまずいてしまったですがTurbo Rails TutorialDev Containertailwindcss を利用してやってみようと思っていたんですよね。

うまくできるかわかりませんが、Let’s Try!

環境

  • Apple M3 (MacBook Air 13 2024)
  • macOS Sonoma 14.6.1
  • Visual Studio Code 1.93.0
    • Dev Container 機能拡張をインストール済み
  • Homebrew
  • ruby 3.3.5
    • anyenvrbenv をインストール
    • ruby 3.3.5 を global に設定済み ( rbenv global 3.3.5 )
  • rails 7.2.1 gem
    • gem install rails
  • mysql 9.0.1
    • brew install mysql
  • zstd 1.5.6
    • brew install zstd
  • mysql2 0.5.6 gem
    • gem install mysql2

Turbo Rails tutorial introduction

rails new のコマンドラインオプションを次のように変えて、CSSフレームワークを tailwindcss 、DB を MySQL にする。

rails new quote-editor --css=tailwind --javascript=esbuild --database=mysql --devcontainer
# (以下、実行結果)
#       create
#       create  README.md
#       create  Rakefile
# (省略)
#   Add build:css script
#          run    npm pkg set scripts.build:css="tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --minify" from "."
#          run    yarn build:css from "."
#          run  bundle install --quiet

無事にコマンドが終了したら、Visual Studio Code で開く。

code quote-editor

Dev Container 機能拡張をインストール済みなので Dev Container を含んでいる旨が通知される。

コンテナーで再度開く

「コンテナーで開く」 (2回目からはスクリーンショットのように 「コンテナーで再度開く」)ボタンを押して、しばらくすると MySQL や Redis 、 Selenium などの必要なソフトウェアが全部インストールされた Docker コンテナが構築される。たったこれだけで Rails の開発環境が整う。Dev Container / Docker (docker compose) は便利すぎる。

ただし、CPU が Apple Silicon や ARM の場合は Selenium の Docker イメージを Apple Silicon 対応の seleniarm/standalone-chromium に変えないといけません。ちなみに Selenium は System Test で使います。

いったん、すべての修正をコミットしておきます。以下のコマンド相当の操作を Visual Studio Code のソース管理で行います。以降同様。

git add .
git commit -m 'feat: init'

ここでレポジトリが信頼できないため、ターミナルで以下のコマンドを実行してくれ、と通知されたのでそれに従いました (このあと、もう一度同じような通知があったのでコンテナを再構築するたびにこのコマンドの実行が必要なのかもしれません。面倒ですね)。

git config --global --add safe.directory /workspaces/quote-editor

.devcontainer/compose.yaml.devcontainer/compose.override.yaml に複製 (コピペしてからリネーム) します。そして、以下のように変更します。

services:
  selenium:
    image: seleniarm/standalone-chromium

そして、 .devcontainer/devcontainer.json の dockerComposeFile に先ほど作成した compose.override.yaml を追加します。

 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 487620b..4757ef7 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -2,7 +2,10 @@
 // README at: https://github.com/devcontainers/templates/tree/main/src/ruby
 {
   "name": "quote_editor",
-  "dockerComposeFile": "compose.yaml",
+  "dockerComposeFile": [
+    "compose.yaml",
+    "compose.override.yaml"
+  ],
   "service": "rails-app",
   "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",

ファイルを保存後、通知に従ってコンテナを再構築します。

rebuildボタンを押す

念のため Docker Desktop で正しいイメージ (seleniarm/standalone-chromium) がインストールされていること確認します。

selenium-1コンテナのImageがseleniarm/standalone-chromium:<none>になっている

この変更をコミットして続けます。

git add .
git commit -m 'faet: seleniarm'

rails 7.2.1 だと gem "turbo-rails" はすでに追加されていたので Gemfile は変更しませんでした。

Visual Studio Code のターミナルで以下を実行。

bin/setup
bin/dev
# (以下、実行結果の一部)
# 11:56:46 js.1   | $ esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets --watch
# 11:56:46 css.1  | $ tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --minify --watch
# 11:56:46 js.1   | /bin/sh: 1: esbuild: not found
# 11:56:46 css.1  | /bin/sh: 1: tailwindcss: not found

エラーです。bin/dev はサーバーの起動コマンドなのですが、esbuildtailwindcss がないためサーバーを起動できませんでした。

よくよく考えてみると、 bundle installyarn install を行ったのは rails new のときなのでコンテナではなくてローカル。そのため、コンテナ上でもあらためてそれらを実行する必要があるはず。

まずは bundle から。bundle list で確認したところ gem はすべてインストール済みだった。bundle は OK。

$ bundle list
Gems included by the bundle:
  * actioncable (7.2.1)
  * actionmailbox (7.2.1)
  * actionmailer (7.2.1)
(省略)
  * websocket-extensions (0.1.5)
  * xpath (3.2.0)
  * zeitwerk (2.6.18)
Use `bundle info` to print more detailed information about a gem

次に yarn。こちらはさっぱりだめでした。

$ yarn global list --depth=0
yarn global v1.22.22
Done in 0.02s.

$ yarn list --depth=0
yarn list v1.22.22
Done in 0.02s.

rails new のときの実行ログを眺めたところ、以下をコンテナ上で再実行しないといけなさそう。コマンド的には package.json にこれらのパッケージを記載したほうが良さそうなのですが、記載されていない理由があるのだろうか。

(省略)
  Install esbuild
         run    yarn add --dev esbuild from "."
(省略)
  Install Turbo
         run    yarn add @hotwired/turbo-rails from "."
(省略)
  Install Stimulus
         run    yarn add @hotwired/stimulus from "."
(省略)
  Install Tailwind (+PostCSS w/ autoprefixer)
(省略)
         run    yarn add tailwindcss@latest postcss@latest autoprefixer@latest from "."

それぞれのコマンドをコンテナ上でも実行します。必要なパッケージがインストールされます。

yarn add --dev esbuild
yarn add @hotwired/turbo-rails
yarn add @hotwired/stimulus
yarn add tailwindcss@latest postcss@latest autoprefixer@latest

yarn list --depth=0
# (以下、実行結果)
# yarn list v1.22.22
# ├─ @alloc/quick-lru@5.2.0
# ├─ @esbuild/aix-ppc64@0.23.1
# ├─ @esbuild/android-arm@0.23.1
# (省略)
# ├─ wrap-ansi-cjs@7.0.0
# ├─ wrap-ansi@8.1.0
# └─ yaml@2.5.1
# Done in 0.07s.

あらためてサーバーを起動します。

$ bin/dev
12:25:33 web.1  | started with pid 14095
12:25:33 js.1   | started with pid 14096
12:25:33 css.1  | started with pid 14100
12:25:33 js.1   | yarn run v1.22.22
(省略)
12:25:34 web.1  | * Listening on http://127.0.0.1:3000
12:25:34 web.1  | * Listening on http://[::1]:3000
12:25:34 web.1  | Use Ctrl-C to stop
12:25:34 css.1  |
12:25:34 css.1  | Done in 156ms.

よし!いつもの rails server ですね。

早速ブラウザでアクセスしてみます。せっかくなので「エディタでのプレビュー」を選択して、Visual Studio Code 上でプレビュー。これは Chromium ベースのエディタの強みですね。

エディタでのプレビューボタンを押す

…。えっ、真っ白なんですけど!?

トップ画面に何も表示されない

いつもの Yay! はどこいったの!?

Yay!You're on Rails!

恐る恐る Chrome で http://localhost:3000 にアクセスしてみると…

Railsのトップ画面

いつもの Yay! じゃないのですが、ちゃんと表示されていました。

Visual Studio Code 上のシンプルブラウザーだとダメみたい。Turbo が原因だと予想していますが、デバッグ方法がわからないため深追いしません。 Turbo を使っているウェブサイトでは Visual Studio Code のシンプルブラウザーは使えない 、ということを覚えておきます。

git add .
git commit -m 'feat: install esbuild, tailwindcss'

今回はここまで。ソースコードは takaokouji/quote-editor においていますので、興味がある方は Watch していただけると励みになります。

Dev Container は簡単そうに見えて、やってみるとそれなりに険しい道ですね。百聞は一見にしかず、ですね。

協力者の募集

スモウルビー (GitHub) の開発にご協力いただける方を常に募集しています。

ご協力いただける方は、 contact@smalruby.jp までご連絡いただいてもいいですし、連絡なしで「xxx のブロックに対応しました」というPRを作成してもらってもかまいません。むしろその方が好都合です。スポンサーも募集しています

また、 拙著:小学生から楽しむ きらきらRubyプログラミング をご購入いただけるとありがたいです。スモウルビーの使い方と教え方を学ぶことができる書籍です。特に小・中学校の先生に読んでいただきたいです。
小学生から楽しむ きらきらRubyプログラミング

日本中の小・中学生が学校の授業や地域のプログラミング教室でスモウルビーを使っています。みなさんのご協力で、たくさんの子どもたちがハッピーになります。ご協力、よろしくお願いします。