Ruby on Rails 7.2 リリースノート

Rails 7.2の注目ポイント:

  • Dev Container(Development Container)設定がオプションで利用可能になった
  • ブラウザの最小バージョン指定がデフォルトで行われるようになった
  • Ruby 3.1以上が必須になった
  • PWA(Progressive Web Application)ファイルがデフォルトで生成されるようになった
  • RuboCop omakaseのルールがデフォルトで使われるようになった
  • GitHub CIワークフローが新規アプリケーションでデフォルトで生成されるようになった
  • Brakemanが新規アプリケーションでデフォルトで有効になった
  • Pumaのスレッドカウントが新しいデフォルト値で改善された
  • ジョブがトランザクション内でスケジューリングされないようになった
  • トランザクションごとにコミットやロールバックのコールバックを書けるようになった
  • YJITがデフォルトで有効(Ruby 3.3以降で実行する場合)
  • Rails Guidesのページデザインを一新
  • メモリ割り当てを最適化するjemallocをデフォルトでDockerfileに設定するようになった
  • bin/setupを実行するとpuma-devの設定方法を提案するようになった

本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストを参照してください。

目次

  1. Rails 7.2にアップグレードする
  2. 主要な機能
  3. Railties
  4. Action Cable
  5. Action Pack
  6. Action View
  7. Action Mailer
  8. Active Record
  9. Active Storage
  10. Active Model
  11. Active Support
  12. Active Job
  13. Action Text
  14. Action Mailbox
  15. Ruby on Rails Guides
  16. クレジット

1 Rails 7.2にアップグレードする

既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 7.1までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 7.2にアップデートしてください。アップグレードの注意点などについてはRailsアップグレードガイドを参照してください。

2 主要な機能

2.1 アプリケーションでDev Containerが設定可能になった

Development Container(以下Dev Container)を使うと、コンテナ環境をフル機能の開発環境として利用可能になります。

Rails 7.2から、アプリケーションでDev Container設定を生成する機能が追加されました。追加される設定には、.devcontainer/フォルダ内のDockerfileファイル、docker-compose.ymlファイル、devcontainer.jsonファイルなどがあります。

デフォルトのDev Containerには以下が含まれます。

  • Redisコンテナ(KredisやAction Cableなどで利用)
  • データベース(SQLite、Postgres、MySQL、またはMariaDB)
  • ヘッドレスChromeコンテナ(システムテスト用)
  • Active Storage(ローカルディスクを利用する設定、プレビュー機能が有効)

Dev Containerを利用する新規アプリケーションを生成するには、以下のコマンドを実行します。

$ rails new myapp --devcontainer

既存のアプリケーション用にdevcontainer設定を生成するには、devcontainerコマンドが利用可能です。

$ rails devcontainer

詳しくは、Dev Containerでの開発ガイドを参照してください。

2.2 ブラウザのバージョン保護機能がデフォルトで追加されるようになった

Railsの全アクションへのアクセス(またはonly:except:で指定されたアクションのみへのアクセス)を許可する、ブラウザバージョン指定機能が追加されました。

versions:に渡したハッシュまたは名前付きセットのみが、指定バージョンより下の場合にブロックされます。

つまり、それ以外の未知のブラウザや、User-Agentヘッダーを送信していないエージェントはアクセスを許可されます。

ブロックされたブラウザには、デフォルトでHTTPステータスコード"406 Not Acceptable"がpublic/406-unsupported-browser.htmlファイルで配信されます。

例:

class ApplicationController < ActionController::Base
  # 以下をネイティブサポートするブラウザのみを許可:
  # webp画像、webプッシュ、バッジ、importmap、CSSネスティングと`:has`
  allow_browser versions: :modern
end

class ApplicationController < ActionController::Base
  # ChromeとOpera: 全バージョンを許可する
  # Internet Explorer: どのバージョンも不許可にする
  # Safari: 16.4以上を許可する
  # Firefox: 121以上を許可する
  allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
end

class MessagesController < ApplicationController
  # ApplicationControllerでブロックされるブラウザに加えて、
  # showアクションでOpera 104未満とChrome 119未満もブロックする
  allow_browser versions: { opera: 104, chrome: 119 }, only: :show
end

新規生成されるアプリケーションでは、このバージョン保護機能がApplicationControllerに設定されます。

詳しくは、Rails APIドキュメントのallow_browserを参照してください。

2.3 最小RubyバージョンがRuby 3.1になった

従来は、Railsが古いRubyとの互換性を失うのは、Railsの新しいメジャーバージョンがリリースされた場合だけでしたが、このポリシーを変更します。その理由は、従来のポリシーではサポートが終了して久しいRubyバージョンをサポートしなければならなくなったり、Railsのメジャーバージョンを上げるたびに複数バージョンのRubyをサポート終了しなければならなくなったりするためです。

今後は、Railsのマイナーバージョンがリリースされるときに、その時点でサポートが終了しているRubyバージョンをサポート対象から外します。

Rails 7.2では、Ruby 3.1が新しい最小バージョンになります。

2.4 PWA(Progressive Web Application)ファイルがデフォルトで生成されるようになった

Railsを用いたPWAアプリケーションの作成をより適切にサポートするための準備として、マニフェストとサービスワーカー用にデフォルトのPWAファイルを生成するようになりました。これらのファイルはapp/views/pwaから配信され、ERBで動的にレンダリングできます。これらのファイルは、生成されたルーティングファイル内のデフォルトのルーティングとともに、rootディレクトリに明示的にマウントされます。

詳しくは、#50528を参照してください。

2.5 RuboCopの「おまかせ」ルールがデフォルトで追加されるようになった

Railsアプリケーションに、rubocop-rails-omakaseのルールセットで設定済みのRuboCopがデフォルトで含まれるようになりました。

Ruby は、さまざまな方言を許容するだけでなく、その多様性を尊重する、美しく表現力豊かな言語です。Rubyは、あらゆるライブラリやフレームワークやアプリケーションを統一されたスタイルだけで記述することを意図した言語ではありません。あなたやあなたのチームが、喜びをもたらす特定のハウススタイルを培ってきた場合は、それを尊重すべきです。

このRuboCopスタイルは、特定の方言をまだ採用していない人やチームに向けたコレクションです。合理的な根拠のある設定や、少なくともRubyのコーディングスタイルを統一する設定でスタートできるデフォルトルールを採用することで、メリットを得られる方を念頭に置いています。

個別のルールは、その書き方が正しいか間違っているかではなく、Rails作成者にとっての「Railsらしい美しい書き方」を表しているに過ぎません。ルールをそのまま使うもよし、これを元に独自ルールを作るのもよし、ルール策定のヒントを得るのに使うもよし、皆さんの望むようにお使いください。

2.6 GitHub CIワークフローがデフォルトで新規アプリケーションに追加されるようになった

Railsの新規アプリケーションに、デフォルトでGitHub CIワークフロー用のファイルが追加されるようになりました。これにより、特にRails初心者がセキュリティスキャンやlintやテストを最初から自動化できるようになります。この機能は、単体テストの開始以来行われてきたことを自然な形で現代に引き継いだものであると私たちは考えています。

もちろんGitHub Actionsは、無料トークンを使い切った後は、プライベートリポジトリ用の商用クラウド製品として利用することになります。しかし、GitHubとRailsの緊密な関係、初心者にとって使いやすい圧倒的なプラットフォームデフォルト設定、そして初心者が身につけるのにふさわしいCI習慣を学べる教育的価値を考えると、これは許容できるトレードオフであると考えています。

2.7 Brakemanが新規アプリケーションでデフォルトで有効になった

Brakeman gemは、Railsの一般的なセキュリティ脆弱性がproduction環境に侵入するのを防ぐ優れた方法です。

新しいアプリケーションにはBrakemanがインストールされるようになり、GitHub CIワークフローと組み合わせることで、プッシュのたびに自動的に実行されます。

2.8 Pumaのデフォルトのスレッド数が新しくなった

Railsで使われるPuma(Webサーバー)のデフォルトのスレッド数が5から3に変更されました。

最適化されたRailsアプリケーションの性質上、高速なSQLクエリとジョブ経由で実行される低速のサードパーティ呼び出しが組み合わさった状態でのスレッド数が多すぎると、RubyはGVL(Global VM Lock)が解放されるまでかなり長い間待つことになる可能性があり、レイテンシ(リクエストやレスポンスの時間)に悪影響を及ぼします。

慎重な検討と調査の結果、production環境で実際に実行されているアプリケーションで実証された経験に基づいて、デフォルトのスレッドを3にすることでコンカレンシー(並行性)とパフォーマンスのバランスが取れていると判断しました。

この変更に関する議論について詳しくは、#50450で確認できます。

2.9 ジョブがトランザクション内でスケジューリングされないようになった

Active Jobでよくある間違いは、以下のようにトランザクションの内部でジョブをエンキューしてしまうことです。このような書き方をすると、トランザクションがコミットされる前に別のプロセスによってジョブが拾われて実行される可能性があり、さまざまなエラーが発生します。

Topic.transaction do
  topic = Topic.create

  NewTopicNotificationJob.perform_later(topic)
end

Active Jobが改修されて、ジョブのエンキューをトランザクションのコミットが完了するまで自動的に延期し、トランザクションがロールバックされた場合はジョブを削除するようになりました。

この振る舞いは、さまざまなキュー実装で無効にできます。以下のようにジョブ単位で無効にしたり矯正したりできます。

class NewTopicNotificationJob < ApplicationJob
  self.enqueue_after_transaction_commit = :never
end

詳しくは、#51426を参照してください。

2.10 トランザクションごとにコミットやロールバックのコールバックを書けるようになった

この機能は、トランザクションコールバックをレコードの外で登録可能になったことで実現できました。

ActiveRecord::Base.transactionActiveRecord::Transactionオブジェクトをyieldするようになりました。ここにコールバックを登録できます。

Article.transaction do |transaction|
  article.update(published: true)

  transaction.after_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

ActiveRecord::Base.current_transactionも追加され、ここにもコールバックを登録できるようになりました。

Article.current_transaction.after_commit do
  PublishNotificationMailer.with(article: article).deliver_later
end

最後に、ActiveRecord.after_all_transactions_commitが追加されました。これは、トランザクションの内部または外部で実行される可能性があり、かつステートの変更が正しく永続化された後で実行されなければならないコードに対して使えます。

def publish_article(article)
  article.update(published: true)

  ActiveRecord.after_all_transactions_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

詳しくは、#51474を参照してください。

2.11 YJITがRuby 3.3以降でデフォルトで有効になった

YJITは、Ruby 3.1以降のCRubyで利用可能なJIT(Just-In-Time)コンパイラです。YJITはRailsアプリケーションのパフォーマンスを大幅に向上させることが可能で、レイテンシを15〜25%改善できます。

Rails 7.2をRuby 3.3以降で実行すると、YJITがデフォルトで有効になります。

YJITを無効にするには以下の設定を行います。

Rails.application.config.yjit = false

2.12 Rails GuidesのWebデザインが一新された

2021年12月にリリースされたRails 7.0では、Rails公式ホームページ起動画面が新しくなりましたが、Rails GuidesのWebデザインは2009年からほとんど変更されていませんでした。この点は見逃せません(皆さんからフィードバックをいただきました)。

現在、Railsフレームワークの複雑さを解消し、ドキュメントの一貫性と明瞭性を高めて最新の内容にするための作業が全面的に進められているので、この機会にRails GuidesのWebデザインも同様にモダンかつシンプルで新鮮なものにする作業に取り組むときが来ました。

UXデザイナーJohn Athaydeとの共同作業によって、Railsホームページの新しい外観や雰囲気をRails Guidesにも取り入れ、すっきりと洗練された最新デザインに変えました。

レイアウトは従来と同じですが、今度からRails Guidesに以下の変更が反映されます。

  • クリアかつシンプルなWebデザイン。
  • フォント、配色、ロゴがRailsホームページと統一された。
  • アイコンが更新された。
  • ページ操作がシンプルになった。
  • 「チャプター」ナビゲーションバーがスクロール時に固定されるようになった。

Webデザインの変更前と変更後の画像については、Rails公式ブログのお知らせを参照してください。

2.13 Dockerfileにメモリアロケーション最適化用のjemallocが設定されるようになった

Rubyのメモリアロケーションにmallocが使われていると、特にPumaで使われているようなマルチスレッドでメモリ断片化問題が発生する可能性があります。別のパターンを利用するアロケータに切り替えると、メモリ使用量を大幅に削減できる可能性があります。

Rails 7.2のDockerfileでは、メモリアロケーション最適化用のjemallocがデフォルトで設定されるようになりました。

2.14 bin/setupを実行するとpuma-devの設定方法を提案するようになった

Puma-devは、Dockerを使っていない環境で複数のRailsアプリケーションを同居させる形でローカル開発するのに最適な方法です。

bin/setupを実行すると、Puma-devをセットアップする方法を提案する新しいコメントが表示されるようになりました。

3 Railties

変更点について詳しくはChangelogを参照してください。

3.1 削除されたもの

  • 非推奨化されていたRails::Generators::Testing::Behaviourを削除。

  • 非推奨化されていたRails.application.secretsを削除。

  • 非推奨化されていたRails.config.enable_dependency_loadingを削除。

  • 非推奨化されていたfind_cmd_and_execコンソールヘルパーを削除。

  • rails newコマンドやrails db:system:changeコマンドからoraclesqlserver、JRuby固有のデータベースアダプタのサポートを削除。

  • ジェネレータからconfig.public_file_server.enabledオプションを削除。

3.2 非推奨化

3.3 主な変更点

  • rubocop-rails-omakase gemのRuboCopルールを新規アプリケーションとプラグインの両方にデフォルトで追加。

  • Brakemanを新規アプリケーションにセキュリティチェック用デフォルト設定として追加。

  • DependabotBrakemanRuboCop用のGitHub CIファイルを追加し、新規アプリケーションとプラグインの両方についてテストをデフォルトで実行するようになった。

  • YJITがRuby 3.3以降の新規アプリケーションでデフォルトで有効になった。

  • 以下を実行することで.devcontainerフォルダが生成されるようになった(VS Codeでアプリケーションをコンテナ実行するのに用いられる)。

    $ rails new myapp --devcontainer
    
  • イニシャライザをテストするRails::Generators::Testing::Assertions#assert_initializerが導入された。

  • 新規アプリケーションのシステムテストでヘッドレスChromeがデフォルトで使われるようになった。

  • BACKTRACE環境変数で通常のサーバー実行時にバックトレースのクリーニングを無効にするサポートが追加された(従来はテスト時のみ利用可能だった)。

  • マニフェストおよびサービスワーカー用のPWA(Progressive Web App)ファイルがデフォルトで追加され、app/views/pwaから配信されるようになり、ERBで動的にレンダリング可能になった。

4 Action Cable

変更点について詳しくはChangelogを参照してください。

4.1 削除されたもの

4.2 非推奨化

4.3 主な変更点

5 Action Pack

変更点について詳しくはChangelogを参照してください。

5.1 削除されたもの

  • 非推奨化されていたActionDispatch::IllegalStateError定数を削除。

  • 非推奨化されていたAbstractController::Helpers::MissingHelperError定数を削除。

  • 非推奨化されていたActionController::ParametersHashの比較機能を削除。

  • 非推奨化されていたRails.application.config.action_dispatch.return_only_request_media_type_on_content_typeを削除。

  • パーミッションポリシーの非推奨化されていたspeakervibratevrディレクティブを削除。

  • Rails.application.config.action_dispatch.show_exceptionsの非推奨化されていた設定(truefalseに設定可能)を削除。

5.2 非推奨化

  • Rails.application.config.action_controller.allow_deprecated_parameters_hash_equalityを非推奨化。

5.3 主な変更点

6 Action View

変更点について詳しくはChangelogを参照してください。

6.1 削除されたもの

  • 非推奨化されていた@rails/ujsが削除され、Turboに置き換えられた。

6.2 非推奨化

  • tag.brタグビルダーを使う場合に、void要素にコンテンツを渡すことが非推奨化された。

6.3 主な変更点

7 Action Mailer

変更点について詳しくはChangelogを参照してください。

7.1 削除されたもの

  • 非推奨化されていたconfig.action_mailer.preview_pathを削除。

  • assert_enqueued_email_withで非推奨化されていた:argsからのパラメータを削除。

7.2 非推奨化

7.3 主な変更点

8 Active Record

変更点について詳しくはChangelogを参照してください。

8.1 削除されたもの

  • 非推奨化されていたRails.application.config.active_record.suppress_multiple_database_warningを削除。

  • 存在しない属性名を指定してalias_attributeを呼び出す非推奨化サポートを削除。

  • ActiveRecord::Base.remove_connectionで非推奨化されていたname引数を削除。

  • 非推奨化されていたActiveRecord::Base.clear_active_connections!を削除。

  • 非推奨化されていたActiveRecord::Base.clear_reloadable_connections!を削除。

  • 非推奨化されていたActiveRecord::Base.clear_all_connections!を削除。

  • 非推奨化されていたActiveRecord::Base.flush_idle_connections!を削除。

  • 非推奨化されていたActiveRecord::ActiveJobRequiredErrorを削除。

  • コネクションアダプタで引数を2つ渡してexplainを定義する非推奨化サポートを削除。

  • 非推奨化されていたActiveRecord::LogSubscriber.runtimeメソッドを削除。

  • 非推奨化されていたActiveRecord::LogSubscriber.runtime=メソッドを削除。

  • 非推奨化されていたActiveRecord::LogSubscriber.reset_runtimeメソッドを削除。

  • 非推奨化されていたActiveRecord::Migration.check_pending!メソッドを削除。

  • ActiveRecord::MigrationContextSchemaMigrationInternalMetadataクラスを引数として渡す非推奨化サポートを削除。

  • 単数形の関連付けを複数形の名前で参照する非推奨の振る舞いを削除。

  • 非推奨化されていたTestFixtures.fixture_pathを削除。

  • ActiveRecord::Base#read_attribute(:id)がカスタム主キー値を返す非推奨化サポートを削除。

  • serializeにコーダーやクラスを第2引数として渡す非推奨化サポートを削除。

  • データベースアダプタの非推奨化されていた#all_foreign_keys_valid?を削除。

  • 非推奨化されていたActiveRecord::ConnectionAdapters::SchemaCache.load_fromを削除。

  • 非推奨化されていたActiveRecord::ConnectionAdapters::SchemaCache#data_sourcesを削除。

  • 非推奨化されていた#all_connection_poolsを削除。

  • role引数が指定されていない場合に、現在のロールのコネクションプールで#connection_pool_list#active_connections?#clear_active_connections!#clear_reloadable_connections!#clear_all_connections!#flush_idle_connections!が適用される非推奨化サポートを削除。

  • 非推奨化されていたActiveRecord::ConnectionAdapters::ConnectionPool#connection_klassを削除。

  • 非推奨化されていた#quote_bound_valueを削除。

  • ActiveSupport::Durationを変換せずに式展開で渡せる非推奨化サポートを削除。

  • add_foreign_keydeferrable: trueを渡す非推奨化サポートを削除。

  • ActiveRecord::Relation#mergerewhereを渡す非推奨化サポートを削除。

  • トランザクションブロックをreturnbreak、またはthrowで終了するとロールバックする非推奨化された振る舞いを削除。

8.2 非推奨化

  • Rails.application.config.active_record.allow_deprecated_singular_associations_nameを非推奨化。

  • Rails.application.config.active_record.commit_transaction_on_non_local_returnを非推奨化。

8.3 主な変更点

9 Active Storage

変更点について詳しくはChangelogを参照してください。

9.1 削除されたもの

  • 非推奨化されていたconfig.active_storage.replace_on_assign_to_manyを削除。

  • 非推奨化されていたconfig.active_storage.silence_invalid_content_types_warningを削除。

9.2 非推奨化

9.3 主な変更点

10 Active Model

変更点について詳しくはChangelogを参照してください。

10.1 削除されたもの

10.2 非推奨化

10.3 主な変更点

11 Active Support

変更点について詳しくはChangelogを参照してください。

11.1 削除されたもの

  • 非推奨化されていたActiveSupport::Notifications::Event#childrenActiveSupport::Notifications::Event#parent_of?を削除。

  • 以下のメソッドをdeprecatorを渡さずに呼び出せる非推奨サポートを削除。

    • deprecate
    • deprecate_constant
    • ActiveSupport::Deprecation::DeprecatedObjectProxy.new
    • ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new
    • ActiveSupport::Deprecation::DeprecatedConstantProxy.new
    • assert_deprecated
    • assert_not_deprecated
    • collect_deprecations
  • 非推奨化されていたActiveSupport::Deprecationのインスタンスへの委譲を削除。

  • 非推奨化されていたSafeBuffer#clone_emptyを削除。

  • #to_default_s from ArrayDateDateTimeTimeで非推奨化されていた#to_default_sを削除。

  • キャッシュストレージの非推奨化されていた:pool_sizeオプションと:pool_timeoutオプションを削除。

  • 非推奨化されていたconfig.active_support.cache_format_version = 6.1サポートを削除。

  • 非推奨化されていたActiveSupport::LogSubscriber::CLEAR定数とActiveSupport::LogSubscriber::BOLD定数を削除。

  • ログテキストをActiveSupport::LogSubscriber#colorの位置引数ブーリアンで太字にする非推奨化サポートを削除。

  • 非推奨化されていたconfig.active_support.disable_to_s_conversionを削除。

  • 非推奨化されていたconfig.active_support.remove_deprecated_time_with_zone_nameを削除。

  • 非推奨化されていたconfig.active_support.use_rfc4122_namespaced_uuidsを削除。

  • MemCacheStoreDalli::Clientインスタンスを渡せる非推奨化サポートを削除。

11.2 非推奨化

11.3 主な変更点

12 Active Job

変更点について詳しくはChangelogを参照してください。

12.1 削除されたもの

  • 非推奨化されていたBigDecimal引数向けのプリミティブなシリアライザを削除。

  • scheduled_at属性に数値を設定できる非推奨化サポートを削除。

  • retry_on:waitオプションの非推奨化された:exponentially_longer値を削除。

12.2 非推奨化

  • Rails.application.config.active_job.use_big_decimal_serializeを非推奨化。

12.3 主な変更点

13 Action Text

変更点について詳しくは[Changelog][active-text]を参照してください。

13.1 削除されたもの

13.2 非推奨化

13.3 主な変更点

14 Action Mailbox

変更点について詳しくはChangelogを参照してください。

14.1 削除されたもの

14.2 非推奨化

14.3 主な変更点

15 Ruby on Rails Guides

変更点について詳しくはChangelogを参照してください。

15.1 主な変更点

16 クレジット

Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。

フィードバックについて

Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。

原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨

本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。

Railsガイド運営チーム (@RailsGuidesJP)

支援・協賛

Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。

  1. Star
  2. このエントリーをはてなブックマークに追加