https://github.com/rails/rails
ActionMailer の `assert_part` / `assert_no_part` が添付ファイル付きメールの本文を検出できなかった問題を、`Mail#all_parts` に置換して解消し、テストの正確性と互換性を保ちました。
Rate limiting の `by:` が `cache_key` を持つオブジェクトを自動的にキーとして利用できるよう拡張され、ユーザー単位のレート制御が簡潔に記述可能になった。
`rails dbconsole` が `schema_search_path` を PGOPTIONS に反映し、PostgreSQL のコンソール接続とアプリケーション設定を一致させる変更です。設定ハッシュは deep_dup され安全に扱われ、既存変数との互換性も維持されています。
PostgreSQL の `cidr`/`inet` カラムで IPv6 アドレスをデフォルト値に使用した際、スキーマダンプ時に `/32` プレフィックスが誤って省略されサイレントにデータが破壊されるバグを修正。`type_cast_for_schema` の判定条件を `value.ipv6? ? 128 : 32` に変更し、アドレスファミリーに応じた正しいフルマスク長と比較するよう改めました。2014年の導入以来続いていた IPv4 専用の仮定が解消されています。
スタンドアロン接続(NullPool使用)が初回クエリでサーバーバージョンを取得する際に発生するデッドロックを修正。同期プリミティブを再入不可能なMutexから再入可能なMonitorに切り替えることで、ConnectionPoolと同様の動作を実現しました。
Active Recordの各モジュールで定数やキャッシュオブジェクトを積極的にfreezeする変更が導入されました。`||=`によるメモ化パターンをfreeze済み定数への参照に置き換えることで、Ractor間での安全なオブジェクト共有を可能にします。PR #57323に続くRactor対応の一環です。
`pool.preconnect`がリーパースレッドと並行実行された際の競合状態を修正。`preconnect`メソッド全体を`reaper_lock`ブロックで囲むことで、`disconnect`等の既存グローバル操作と同一のロック戦略に統一しました。リエントラントな`Monitor`実装により、リーパー自身の`preconnect`呼び出しはブロックされません。
`Post.limit(0).async_count` が `ActiveRecord::Promise` ではなく生の整数 `0` を返していたバグが修正されました。`execute_simple_calculation` の早期リターンパスで `@async` フラグを確認し、非同期モードでは `Promise::Complete.new(0)` を返すよう1行変更することで、クエリを発行しない高速パスを維持しつつ型契約を満たします。
`eager_load: true` 環境で `load_defaults 8.1` を使用すると ERB テンプレートの依存関係トラッキングに `ERBTracker` が誤って登録される不具合が修正されました。原因はネストした `after_initialize` ブロックによる実行タイミングのずれで、専用の `initializer "action_view.set_render_tracker"` への切り出しと、`render_tracker=` セッターへのトラッカー登録ロジックの集約によって解消されています。
Active Recordに `#default_order` クエリメソッドと `default_order` アソシエーションオプションが追加されました。`order_values` とは独立した `default_order_values` として管理されるため、明示的な `order` が存在する場合はデフォルト順序が自動的に無視される設計になっています。`has_many` の宣言オプションとメソッドチェーンの両方のインターフェースをサポートしています。
Action Cable の `before_subscribe` コールバック内で `#reject` を呼んでも `#subscribed` が実行されてしまうバグが修正されました。`subscribe_to_channel` メソッドに `unless subscription_rejected?` の条件を1行追加することで、通常のコントローラにおける `before_action` のガード動作と一貫した挙動が実現されています。
`Array#to_query` が空ハッシュ `{}` を含む配列に対して `&&` を二重出力していたバグを修正。`collect` を `filter_map` に置き換え、`to_query` が空文字列を返す要素を結合前に除外することで、WHATWG URL 標準に準拠した正しいクエリ文字列を生成するようになりました。
Active SupportのRactor対応に向けた準備として、`Kernel`モジュールに`ractor_make_shareable`など4つのシムメソッドが追加されました。Ractorが利用可能な環境では実際のRactorメソッドへ委譲し、そうでない環境ではno-op(引数をそのまま返す)として動作します。バージョン判定をロード時の`if`で完結させることで、フレームワーク全体のバージョン分岐コードを排除しつつ呼び出しコストを最小に抑えた設計です。
`ActionDispatch::ExceptionWrapper` のクラス変数(`rescue_responses`・`rescue_templates`・`wrapper_exceptions`・`silent_exceptions`)をfreezeし、設定適用を破壊的メソッドから新オブジェクト再代入方式に変更してRactor安全にしました。あわせて `wrapper_exceptions` と `silent_exceptions` の公開設定API(`config.action_dispatch.wrapper_exceptions` / `config.action_dispatch.silent_exceptions`)が追加されています。
Action Cable の内部アーキテクチャが大幅に再編され、WebSocket処理などの低レベル実装(Server::Socket)とアプリケーション層(Connection::Base)が明確に分離されました。ThreadedExecutor の独立、SubscriberMap::Async による非同期処理の統一、専用エラークラスの導入など、代替サーバー実装を可能にする拡張性の基盤が整備されています。既存のユーザーコードへの破壊的変更はありません。
Mailgun・Postmark・SendGrid の Action Mailbox Ingress コントローラが、raw email パラメータに文字列以外の値(配列など)が渡された場合に `422 Unprocessable Content` を返すようになりました。これまでは不正な値が内部処理まで到達して `TypeError` を発生させていましたが、各コントローラに `MalformedEmailError` が追加されたことで、既存の不正値処理パターンと一貫した挙動になっています。
MariaDBの関数デフォルト検出を `new_column_from_field`(カラムごと)から `column_definitions`(テーブルごと)へ移動することで、非MariaDB接続での余分な `SHOW CREATE TABLE` クエリを完全に排除。MariaDB接続でも候補が存在する場合のみ最大1回のクエリに抑え、スキーマ取得のクエリ数を4回から3回に削減しました。
Mailgun・Postmark の Action Mailbox ingress において、配列などの不正な形式の original recipient パラメータが `String#prepend` に到達して `TypeError` を発生させていた問題を修正しました。各コントローラに専用の例外クラスと型チェックメソッドを追加し、不正なパラメータには仕様通り `422 Unprocessable Content` を返すようになります。
`ActiveJob::TestHelper`がテストのsetup/teardownごとに全Jobサブクラスをスキャンしていたパフォーマンス問題(O(N))と、ActiveSupport 8.1.3での`class_attribute`変更に起因するアダプター検出バグを修正。`TestQueueAdapter`モジュールをConcernベースからレジストリパターンに全面改修し、teardownのリセット処理をO(1)に改善しました。
`significant: true` オプション使用時に `Float::INFINITY` や `Float::NAN` を渡すと `FloatDomainError` が発生していた問題を修正しました。`RoundingHelper#digit_count` に非有限数の早期リターンを1行追加することで、`number_to_rounded`・`number_to_percentage`・`number_to_currency`・`number_to_delimited` の4つのヘルパーで `significant` パスと非 `significant` パスの挙動が統一されます。