Rails 8 リリースノートについてまとめたものを備忘録として残しておく

Rails 8 系での新機能および変更点

Kamal(Docker コンテナのデプロイツール)

Kamalという Docker コンテナを本番環境に簡単にデプロイするツールが同梱されるようになった
※Rails アプリケーションのデプロイで使用されていた Capistrano をコンテナように置き換えたツールのイメージ

Thruster(HTTP/2 プロキシサーバ)

Rails アプリケーションの Docker ファイルに、Thruster と呼ばれるプロキシサーバの設定が含まれ、Puma の前段に配置するようになった
これにより、Nginx など別の Web サーバーを用意する必要がなくなる

  • Thrusterの機能
    • HTTP/2のサポート
    • Let’s Encrypt による自動化された TLS 証明書の管理
    • 公開アセット(JavaScript、CSS、画像など)の HTTP キャッシュ
    • X-Sendfile のサポートと圧縮

Solid Cable

Solid Cable によって Redis を使用せずに WebSocket を使用したリアルタイム機能を使用することができる

Solid Cache

Solid Cache によってメモリを使用した Redis や Memcached よりも長期間にわたって大容量のアプリケーションのデータのキャッシュを行うことができる

Solid Queue

Solid Queue は、Redis を使用した Sidekiq や Resque といったジョブ実行システムと同様に、単純なジョブのエンキューや実行だけでなく、遅延実行、同期処理の制御、定期(繰り返し)実行、キューの停止、優先順序づけなど本格的な実用に耐えるものが実現できる

Solid Queue では、以下の4種類のアクター(Actor)がプロセスとして実行される
※英語で複数形になっているものは複数実行され、The がついているものは1つのみ実行

  • ワーカ(Workers)
    • キューからジョブを取り出し実行を行う
      • solid_queue_ready_executions テーブルに登録されたジョブに対して操作を行う
  • ディスパッチャ(Dispatchers)
    • スケジューリングされたジョブを選択し、ワーカが実行できるようにする
      • solid_queue_scheduled_executions テーブルから solid_queue_ready_executions テーブルにジョブを移動する
  • スケジューラ(The scheduler)
    • 定期(繰り返し)実行の際にジョブをエンキューする
  • スーパーバイザ(The supervisor)
    • ワーカとディスパッチャを設定に基づいて実行し、動作状況をハートビートで監視し、必要に応じて停止と起動を行う

Propshaft で Sprockets を置き換え

Rails 8 で新しく生成されたアプリケーションのアセットパイプラインが、これまで長い間使用されていた Sprockets から Propshaft に変更された
Propshaft はアセットのロードパスの設定と、Digest の付与、開発用のサーバーといった単純な機能に絞ることで、実装としてはよりシンプルで高速に動作する

認証機能の生成

bin/rails generate authentication で認証機能の生成が可能になった
これらは Rails 5 で導入された has_secure_password や Rails 7.1 で導入された authenticate_by を拡張したもので、以下のコードを生成する

  • Sessionモデル
    • ユーザID, トークン, IPアドレス, User-Agent などセッション関連
  • Userモデル
    • メールアドレス, ダイジェスト化されたパスワードなどユーザ関連
  • PasswordsController と view ファイル, PasswordsMailer
    • パスワードリセット機能
  • SessionsController と view ファイル
    • ログイン、ログアウトの機能
  • Authentication concern
    • セッション情報を元に、ログイン関連メソッドをコントローラに提供するモジュール
  • 上記に関連したマイグレーションファイル

Devise など外部のライブラリを使用しなくても、簡単なパスワードログイン機能を Rails だけで実現可能となった