Rails 7.2 リリースノートについてまとめたものを備忘録として残しておく
他バージョンのリリースノートまとめ
Rails 7.2 系での新機能および変更点
開発用のDockerコンテナ(devコンテナ)
Docker コンテナをフル機能の開発環境として使用できる dev コンテナと呼ばれる新機能が追加されました。
デフォルトでは、以下のようなコンテナが含まれています。
- データベース(SQLite, PostgreSQL, MySQL, MariaDBなど)
- Active Storage
- Redis
- システムテスト(Headless Chrome)
新規のアプリケーションで dev コンテナを使用するには、rails new でアプリケーションを生成する際に --devcontainer
オプションを追加する
rails new myapp --devcontainer
YJIT のデフォルト化
YJIT は Ruby の JIT コンパイラで、有効にすることで Rails アプリケーションのパフォーマンスを大幅に向上させ、レイテンシを15〜25%改善することができる
Rails 7.2 で Ruby 3.3以上を使用している場合は、YJIT がデフォルトで有効となる
無効にする場合は以下の設定が必要
Rails.application.config.yjit = false
ブラウザのバージョンの Guard デフォルト化
アプリケーション生成時に以下の設定が Application Controller に追加されるようになった
allow_browser versions: :modern
リクエストのヘッダの User-Agent に基づいて、モダンブラウザ(WebP画像、Import maps、CSS入れ子などの機能をサポート)のアクセスを許可する
※古いバージョンのブラウザに対しては許可せず、HTTP status 406を返す
※User-Agent がリクエストのヘッダに含まれない場合もアクセスを許可するため注意
以下のように特定のブラウザの特定のバージョン以上を各コントローラ毎に許可することも可能
# Safari 16.4+、Firefox 121+をサポートし、IEをサポートしない
allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
また、only オプションをつけることによって、コントローラの特定のアクションのみ、ブラウザのバージョンの制限をかけることも可能
# showアクションで、Opera 104+、Chrome 119+をサポートする
allow_browser versions: { opera: 104, chrome: 119 }, only: :show
PWA(Progressive Web Application)ファイルのデフォルト化
Rails で PWA アプリケーションを作成できるように、デフォルトで manifest.json ファイルと service-worker.js ファイルを app/view/pwa 配下に生成する
※ルーティングも追加される
get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
get "manifest" => "rails/pwa#manifest", as: :pwa_manifest
よく使用される GEM のデフォルト化
- RuboCop
- Rrakeman
GitHub CI ワークフローのデフォルト化
デフォルトで GitHub CI ワークフローが作成されるようになり、.github/workflows/ci.yml
, .github/dependabot.yml
ファイルが生成されるようになった
※rails new を実行する際に、–skip-ciオプションをつけることで、ファイルの生成をスキップすることができる
初期状態では GitHub CI でテストと、前述した RuboCop と Brakeman を実行することができる
※テストで RSpec を実行したり、カスタマイズを行う場合は .github/workflows/ci.yml
ファイルを修正する必要があり
DBのトランザクションへのコールバックの追加
DB のトランザクションのコミットやロールバックの前後にコールバックを指定して、実行できるようになった
具体的には、ActiveRecord::Base.transaction メソッドが、ActiveRecord::Transaction オブジェクトをブロックに渡すようになった
例えば transaction.after_commit でトランザクション内でコールバックを指定できるようになった
例. トランザクション内でメール送信のジョブをエンキューするのではなく、トランザクションのコミットを行ってから、エンキューを行う
Article.transaction do |transaction|
article.update(published: true)
transaction.after_commit do
PublishNotificationMailer.with(article: article).deliver_later
end
end
DB のトランザクション内でジョブをエンキューした場合はトランザクション外で実行
トランザクション内にジョブをエンキューするコードを含む場合に、自動で上記の after_commit コールバックを使用して、コミット後に処理を行うようになった
※コミットに失敗した場合は、エンキューされたジョブは破棄される
Topic.transaction do
topic = Topic.create
NewTopicNotificationJob.perform_later(topic)
end