https://github.com/rails/rails
リバースプロキシ環境でAction CableのオリジンチェックがHTTP_HOSTを直接参照していたためX-Forwarded-Hostが考慮されず、正当なリクエストが拒否される問題を修正しました。allow_request_origin?メソッドでRack::Request.new(env)への直接アクセスをrequest.host_with_portとrequest.ssl?に置き換え、Railsの他の部分と一貫したホスト解決を実現しています。
ActionViewのアセットディレクトリに残存していたビルド済みの rails-ujs.js および rails-ujs.esm.js(合計1,316行)が削除されました。これらはソースコードから生成されたビルドアーティファクトであり、PR本文が「数バージョン前に削除されるべきだった」と述べるように、長期間放置されていたファイルの整理です。ソースコード自体は残存するため機能への影響はありませんが、このファイルを直接参照していたアプリケーションは依存関係の見直しが必要です。
`ActionDispatch::Request` に RFC 9110 §9.2.1 の命名に基づく `safe_method?` と `unsafe_method?` が追加されました。GET・HEAD・OPTIONS・TRACE を安全なメソッドとして判定し、コントローラやミドルウェアで散在しがちだった `get? || head?` パターンを標準的な語彙で置き換えられます。
`belongs_to_required_validates_foreign_key` が `false` の場合、複合外部キーを持つ `belongs_to` のバリデーション条件が `read_attribute` の配列引数処理の不具合により常に `true` となり最適化が無効化されていたバグが修正されました。外部キーが配列の場合は各カラムを個別にチェックするよう条件ラムダが修正され、ソフトデリートパターンと複合外部キーを組み合わせた場合に不当なバリデーションエラーが発生していた問題が解消されます。
Railsの最低サポートRubyバージョンが3.3.1となったことで、Ruby 3.2.0の`Time.new`バグ向けワークアラウンドコードが`ActiveModel::Type::Helpers::TimeValue`から削除されました。ランタイムプローブによる条件分岐と重複した`fast_string_to_time`実装が整理され、25行削除・8行追加でコードが簡素化されています。
`ActiveSupport::Notifications.subscribe` に `prepend: true` オプションが追加され、サブスクライバーをリストの先頭に登録できるようになりました。これにより、他のサブスクライバーが処理する前にイベントペイロードを変更することが可能になります。Stringパターンのみサポートされ、Regexpおよびnilパターンに指定すると `ArgumentError` が発生します。
ActiveSupport::Cache のキー正規化処理に、文字列キー向けのファストパスが追加されました。`key.class == ::String` による直接比較で文字列キーが `#expanded_key` をバイパスするようになり、MemCacheStore のエンコード処理も `String#b` と `gsub!` を活用して不要なオブジェクト生成を削減するよう整理されています。
`ActiveRecord::Associations::Preloader`を直接利用するコードで、複合キーの値がnilの場合に余分なクエリが発行されるバグが修正されました。`owners_by_key`メソッドのnilチェックが複合キー(Array)のtruthy性を考慮していなかったことが原因で、`is_a?(Array) ? key.all? : key`という1行の変更で修正されています。通常パスのパフォーマンスを維持するためのベンチマークに基づく判断も注目点です。
`ActiveRecord::Associations::Association#matches_foreign_key?` が複合キーを配列のまま `read_attribute` に渡すことで `inverse_of` の解決に失敗していたバグを修正。`foreign_key_values` と `primary_key_values` という補助メソッドを導入し、`Array()` でキーを正規化して個別に読み取ることで、単一キー・複合キーの両方を統一的に扱えるよう実装を整理しました。
`ActiveRecord::LogSubscriber#sql_color`の正規表現を先頭ワード抽出方式に変更し、極端に長いSQLクエリで`Regexp::TimeoutError`が発生してクエリがログに記録されない問題を修正しました。従来の全文マッチングから`/\A\s*(\w+)(?:\s|\Z)/`による先頭ワード1回抽出に切り替えることで、SQLの長さに依存しない定数時間の評価を実現しています。
Active Storageを単独で`require`した際に発生する`NameError: uninitialized constant ActiveStorage::OpenSSL`を修正しました。FIPS対応で追加された`checksum_implementation`の初期化コードが`OpenSSL::Digest::MD5`を参照しているにもかかわらず`require "openssl"`が欠落しており、通常のRailsアプリでは他コンポーネントが先にロードするため顕在化しませんでしたが、単体ロード時に障害となっていました。`lib/active_storage.rb`への1行追加で修正されています。
PostgreSQLのマルチスキーマ構成で `db:test:prepare` が失敗するバグを修正。`validate_table_length!` がスキーマプレフィックス(例: `public.`)を含んだ文字列長を測定していたため、有効なテーブル名が誤って `ArgumentError` で拒否されていた。PostgreSQLアダプター固有の `schema_statements.rb` でメソッドをオーバーライドし、既存の `extract_schema_qualified_name` でスキーマ部分を除去してからバリデーションを行うよう修正された。
Active Storageのテストスイートに、ffprobe・ffmpeg・mutoolが未インストールの環境では対象テストを自動スキップする`setup`ブロックが追加されました。CI(Buildkite)環境ではチェックをバイパスするガードも設けており、ローカルでの開発体験を改善しつつCIの網羅性は維持する設計です。
Rails Engineの`routes do`ブロックが、`:make_routes_lazy`イニシャライザ実行前に評価されると`LazyRouteSet`最適化が無効化される問題を修正。新たに導入された`@route_blocks`バッファでブロックを一時蓄積し、`config.route_set_class`の確定後にまとめて適用することで、graphql gem等のEngineでもブート時ルート遅延読み込みが正しく機能するようになる。
PostgreSQLへの接続時に毎回実行していた`pg_type`クエリを廃止し、ビルトイン型のOIDマッピングを静的ファイルとしてRailsに内包することで接続確立コストを削減しました。ユーザー定義型や拡張型については、未知のOIDに遭遇した際に初めてDBへ問い合わせる遅延ロード方式に切り替わります。マッピングデータはPostgreSQLのGitHubリポジトリから自動生成するRakeタスクも追加されています。
RailsのPostgreSQLアダプターにおいて、スキーマ検索パスを指定する旧来のエイリアス`schema_order`が非推奨となりました。Rails 8.3での削除に向け、`schema_search_path`への移行が必要です。`configure_connection`内に`ActiveRecord.deprecator`経由の警告が追加されており、移行期間中は既存の動作に変化はありません。
MySQLの`strict`設定オプションが非推奨となり、Rails 8.3での削除が予定されました。`strict: false`は`variables: { sql_mode: "" }`、`strict: :default`は`variables: { sql_mode: :default }`への移行が推奨されます。既存の動作は維持しつつ、`strict_mode?`メソッド内に一度だけ警告を発するフラグ付きの非推奨警告が追加されています。
RailsのPostgreSQLおよびMySQLアダプターで、接続時のSET文発行ロジックが刷新されました。設定値をfalseにすることで個別の設定をスキップでき、ロードバランサーやプロキシ経由の接続環境での制御が容易になります。PostgreSQLアダプターではすべての設定を一つのハッシュに集約してinternal_set_configで一括適用し、parameter_statusを活用して冗長なSET文の発行を抑制します。
`Server#shutdown` の `wait_for_active_workers` ループ内で `reap_dead_workers` を呼び出すことで、シャットダウン中にワーカーが OOMキルや DRb 切断などで突然死した場合でも無限ループが発生しない修正です。#55794 が「シャットダウン前」の一度きりの WNOHANG スイープしか行っていなかった問題を、ポーリングサイクルごとの継続的なゾンビ回収で解決しています。
`validates`メソッドでトップレベルと個別バリデータの両方に`:if`/`:unless`/`:on`を指定した場合、個別オプションがトップレベルを上書きしてしまうバグを修正。`Hash#merge`のブロック形式を活用した`_merge_validates_options`メソッドを追加し、条件系キーは配列結合・スカラーキーは上書きという明確な区別で後方互換性を保ちつつ修正しました。