Rails 8 tutorial をやってみた

公式のガイド

requirements をみたら早速 ruby の version が古そうだったので最新版を install する
Ruby 3.2 or newer
Rails 8.0.0 or newer
A code editor

rbenv の install から
brew install rbenv ruby-build
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
rbenv list を実行
% rbenv install --list
3.1.6
3.2.6
3.3.6
3.4.1
...

最新の ruby を install
% rbenv install 3.4.1
% rbenv global 3.4.1

rbenv が反映されてなさそうだった
% ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin23]
(⎈|orbstack:N/A)[17:57:56] ~
% which ruby
/usr/bin/ruby
PATHを追加
export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/shims:$PATH"
eval "$(rbenv init - zsh)"
無事切り替え完了
% which ruby
/Users/hiroyuki/.rbenv/shims/ruby
(⎈|orbstack:N/A)[17:59:20] ~
% ruby -v
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [arm64-darwin23]

rails 8 を install
gem install rails
% rails -v
Rails 8.0.1
途中下記のようなエラーが出たが、ここの記事を見て解決

その後はチュートリアルガイド通りに進めることができた

localhost:3000 で初期画面が表示されることを確認(なんか感慨深い)

第五章をやっている
気づいたのだが、ローカルで /bin/rails server
しているだけで db を全く起動していない!
sqlite がデフォルトで使われるってこういうことなのか

ディレクトリを漁っていたらそれらしきファイルがあった
% ls storage/
development.sqlite3

試しにBeeKeeperで開いてみると確かにテーブルがあった!

DBへのコネクションもファイル開くだけなので楽ちん
これはすごい

rails console を起動
% bin/rails console
Loading development environment (Rails 8.0.1)
store(dev)> Rails.version
=> "8.0.1"
store(dev)> exit
なんかちょっといつもの(Rails 7)と違う気がする

第七章についてはほとんど知っている知識だったので適当に読み飛ばす
rails console の reload!
コマンドは知らなかった(便利)

10章まで進めたが、こちらも特に目新しいものはなく
turbo_confirm
は初見だったかなぁ

いよいよ第11章のAuthentication
ここは Rails 8 になって新しく追加された機能と聞いているので楽しみ

言われるがままにこのコマンドを実行
bin/rails generate authentication
何やら22個のファイルが一瞬で生成された

bin/rails db:migrate
users table と sessions table が作成された

言われるがままに最初のユーザーを作成
s3cr3t
ってなんだ?と思ったら secret
の e を 3 にしたものか

authenticated?
メソッドや allow_unauthenticated_access
メソッドについても学んだ
非常に便利

第11章終わり、簡単すぎてあっという間に終わってしまった

続いて第12章、Caching へ
地味に気になっている

言われるがままにキャッシュを設定
bin/rails dev:cache
でキャッシュを有効にしてみる
Read fragment views/products/show:22ce383c7858c442ee839053e869531a/products/1-20250105113710561743 (0.7ms)
Write fragment views/products/show:22ce383c7858c442ee839053e869531a/products/1-20250105113710561743 (1.9ms)
ここの fragment というのがいわゆるcacheのことらしい

これが solid cache というものか?と思っていたら、これは process cache と呼ばれるもので solid cache とはまた別物らしい。チュートリアルだと本番環境でのみ solid cacheを使うみたい。

続いて13章、Action Text
これは Rails 6 で追加された機能らしい(知らなかった)

なんかめっちゃリッチなテキストエディタが追加された
ファイル添付とかもいけるらしい

このままの勢いで Active Storage へ
うわー、これは便利だ

15章の国際化も終了
ここからちょっと重くなりそうなので一旦休憩する

いよいよ16章
rails g mailer
は地味に使ったことなかったかもしれない

after_update_commit
でやるのか

実際にメールが送られるかどうかはそりゃテストできないよな

そして期待の17章、propshaftへ

一気に雰囲気変わった&確かにCSS圧縮されてないっぽい?

import maps 知らなかったなぁ
rails 7 から搭載されたっぽい

もうちょい突っ込むかと思われたが、17章もあっさり終わり

次テストに進む

rails 標準のテスト、実はあまり使ったことなかった(普段はrspec)

rubocopも標準搭載されてるのか

brakeman も標準搭載されてる

いつの間にCIが走ってたのか(21章)

続いて22章、kamalも気になってたポイント

server の設定の部分はちょっと端折られてる感があったのでこれを見つつやってみる

一通り設定したら bin/kamal setup
を実行
最初 docker コマンドがないのでインストールします、というメッセージが出てきてあれ、インストールしたはずなのにと思ったが、これはリモートサーバーにdockerコマンドがないという意味だった

Ctrl+C でキャンセルしてしまったので kamal lock release
を実行して再度やり直す

buildの途中で何やらエラーになった
#15 [build 3/6] RUN bundle install && rm -rf ~/.bundle/ "/usr/local/bundle"/ruby/*/cache "/usr/local/bundle"/ruby/*/bundler/gems/*/.git && bundle exec bootsnap precompile --gemfile
#15 9.991 Fetching gem metadata from https://rubygems.org/.........
#15 16.04 Resolving dependencies...
#15 16.26 Your bundle is locked to rubyzip (2.4) from rubygems repository
#15 16.26 https://rubygems.org/ or installed locally, but that version can no longer be
#15 16.26 found in that source. That means the author of rubyzip (2.4) has removed it.
#15 16.26 You'll need to update your bundle to a version other than rubyzip (2.4) that
#15 16.26 hasn't been removed in order to install.
#15 ERROR: process "/bin/sh -c bundle install && rm -rf ~/.bundle/ \"${BUNDLE_PATH}\"/ruby/*/cache \"${BUNDLE_PATH}\"/ruby/*/bundler/gems/*/.git && bundle exec bootsnap precompile --gemfile" did not complete successfully: exit code: 7
------
> [build 3/6] RUN bundle install && rm -rf ~/.bundle/ "/usr/local/bundle"/ruby/*/cache "/usr/local/bundle"/ruby/*/bundler/gems/*/.git && bundle exec bootsnap precompile --gemfile:

rubyzip が見つからないとのことだったので、一度 Gemfile.lock を削除して bundle install
この状態で再度 bin/kamal setup
を実行すると無事 bundle install が通った

EC2インスタンスは t2.micro
という最小スペックのマシンを選んだが、やはりそうなると多少時間はかかるみたいだ

今度こそ行けるかと思ったらまたエラー
Finished all in 385.2 seconds
Releasing the deploy lock...
Finished all in 389.4 seconds
ERROR (SSHKit::Command::Failed): Exception while executing on host 43.206.156.132: docker exit status: 1
docker stdout: Nothing written
docker stderr: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/images/create?fromImage=khiroyuki1993%2Fstore&tag=064c837311afdfd48befcfb2d3b02872c6b3359f": dial unix /var/run/docker.sock: connect: permission denied

対処法はこのブログに書かれていた

手順をそのまま実行したら setup は完了

ただし pubic ip をそのまま打っても404しか返ってこない
ドメインをRoute53で管理している場合は ssl の設定が使えるらしいのだが、そうでない場合は /etc/host をいじってみても無理そうだったので ssl: false
に設定してみる

こんな感じで proxy 全体をコメントアウトし、再度 kamal setup したら見れた
# proxy:
# ssl: false
# host: app.example.com

HTTP 通信を使っている関係でログインはできなかったが、とりあえず kamal console
までは試せた

というわけで、これにて tutorial 完

最後は bin/kamal remove
でお掃除しておいた