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 でお掃除しておいた