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

Rails 8.1 のリリースノートは以下の通り

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

Railties

  • rails credentials:fetch PATH コマンドが追加された
  • フィクスチャで動的 ERB 式の代わりに静的 BCrypt パスワードダイジェストが生成されるようになった
  • .gitignoreエントリが拡張され、すべてのキーファイルが無視されるようになった
  • bin/setup--reset オプションが追加された
  • GitHub ActionsワークフローテンプレートのRuboCopジョブにRuboCopキャッシュ復元が追加された
  • ActionMailerを使用しないアプリケーションで認証ジェネレータがメーラー関連ファイルの生成をスキップするようになった
  • bin/ciが導入され、テスト、スタイルチェック、セキュリティ監査をローカルまたはクラウドで実行できるようになった
  • 認証ジェネレータ実行時にセッションコントローラテストが生成されるようになった
  • bin/bundler-auditconfig/bundler-audit.ymlが追加され、アプリケーションgemの既知のセキュリティ問題を発見・管理できるようになった
  • bin/bundlebinstubの生成が停止された
  • SessionTestHelperモジュールが追加され、sign_in_as(user)sign_outテストヘルパーが提供されるようになった
  • 認証ジェネレータでパスワードリセットのレート制限が追加された
  • rails new --minimalオプションが更新され、最近追加された機能が除外されるようになった
  • アプリケーションレイアウトにapplication-nameメタデータが追加された
  • ローカルでENVまたはcredentialsからsecret_key_baseが使用されるようになった
  • 生成されたci.ymlファイルにRAILS_MASTER_KEYプレースホルダーが導入された
  • 非標準環境でも Rails コンソールプロンプトがカラー化されるようになった
  • 開発環境とテスト環境で YJIT が有効化されなくなった
  • ポリシーが設定されている場合のみPermissionsPolicy::Middlewareが含まれるようになった

Action Cable

  • ActionCable::Channel#stream_for に複合チャネルを渡せるようになった
    • 例: stream_for [ group, group.owner ]
  • Redis のサブスクリプション接続識別子に nil を設定できるようになった

Action Pack

  • action_controller.loggerを nil または false に設定することで無効化できるようになった
  • .md/.markdownが Markdown 拡張として追加され、デフォルトのmarkdown:レンダラーが追加された
  • エンジンルート検査コマンドにヘッダーが追加された
  • エラーページに「Copy as text」ボタンが追加された
  • rate_limitメソッドにscope:オプションが追加された
  • ActionDispatch::Executorrack.response_finishedコールバックのサポートが追加された
  • rescue_fromが呼び出されたときにログが生成されるようになった
  • Rails 設定の hosts からのホストリダイレクトが許可されるようになった
  • rate_limit.action_controller通知に追加のペイロードが含まれるようになった
  • 組み込みヘルスコントローラーに JSON サポートが追加された
  • ブラウザからクラッシュでソースファイルを開けるようになった
  • クエリ文字列キーが値と同様に有効なエンコーディングかチェックされるようになった
  • PublicExceptionsDebugExceptionsで HEAD リクエストの空のボディが常に返されるようになった
  • RFC 9111に従った HTTP Cache-Control リクエストディレクティブの包括的なサポートが追加された
  • assert_in_body/assert_not_in_bodyがレスポンスボディ内のテキストをチェックする最も簡単な方法として追加された
  • クッキー名が最大許可サイズの計算に含まれるようになった
  • RFC 9111に従ったmust-understandディレクティブが実装された
  • JSON レンダラーが HTML エンティティや Unicode 行区切り文字をエスケープしなくなった
  • テストルートを挿入する前に遅延ルートセットが読み込まれるようになった
  • レンダリング後に head が呼び出された場合にAbstractController::DoubleRenderErrorが発生するようになった
  • Cookie Serializerがメッセージパックを使用する際にActive Support SafeBufferをシリアライズできるようになった
  • Rails.application.reload_routes!がほぼすべてのルートをクリアする問題が修正された
  • #resource または#resources に無効な :only または :except オプションが与えられた場合のArgumentErrorにリソース名が追加された
  • 存在しないコントローラーを指すルートが 404 ではなく 500 を返すようになった
  • ActionDispatch::Session::CacheStorecheck_collisionsオプションが追加された
  • ExceptionWrapperでビルトインテンプレートとのバックトレース行のマッチングが改善された
  • Mimeタイプ のシンボルでコンテンツタイプを設定できるようになった

Action View

  • preload_link_tagで生成される HTML と一致するように Link ヘッダーに fetchpriority が追加された
  • preload_link_tagで生成される Link ヘッダーに CSP nonce が追加された
  • current_page?method:オプションで特定の HTTP メソッドとマッチできるようになった
  • form_tag,token_tag,method_tagで生成される隠し入力から autocomplete=“off” が削除された
  • button_to,check_box,select(multiple付き),file_fieldフォームに含まれる隠しパラメータフィールドから autocomplete=“off” が削除された
  • Action Viewテンプレート間の依存関係を追跡する戦略の設定が有効になった
  • relative_time_in_wordsヘルパーが導入された
  • nonce: falseが javascript_tag, javascript_include_tag, stylesheet_link_tag から nonce 属性を削除するようになった
  • 無制限の数のオブジェクトから dom_id のような文字列を作成する dom_target ヘルパーが追加された
  • collection_checkboxesが隠し<input>を生成する際にhtml_options[:form]が尊重されるようになった
  • レイアウトが render に渡されるローカル変数にアクセスできるようになった
  • テンプレートの strict locals に関連する引数エラーがActionView::StrictLocalsErrorを発生させるようになった
  • ERB テンプレートまたは do-end ブロック内でエラーが発生した場合のマルチライン メソッドのエラーハイライトが改善された
  • コンパイルされたテンプレートでソーステンプレートの終端を超えた行でエラーが発生した場合の ERB テンプレートエラーハイライトのクラッシュが修正された
  • ERB テンプレートエラーハイライトの信頼性が向上し、ハイライトでの無限ループとクラッシュが修正され、代替 ERB ハンドラーの許容性が改善された
  • hidden_fieldhidden_field_tagがカスタム autocomplete 値を受け入れるようになった
  • content_security_policy_nonce_directives設定オプションで指定されたディレクティブの影響を受けるタグに nonce を自動的に追加する新しい設定content_security_policy_nonce_autoが追加された

Action Mailer

  • deliver_all_laterが追加され、複数のメールを一度にエンキューできるようになった

Active Record

  • libpq >= 18pg < 1.6.0の互換性問題により、cancel_any_running_queryPG::Connection#cancelの呼び出しがスキップされるようになった
  • 新しいデータベース設定オプションkeepalive,max_age、min_connectionsが導入され、 pool が max_connections にリネームされた
  • LIMIT 検証がクエリ生成時から limit() が呼び出された時に移動された
  • ActiveRecord::CheckViolationエラークラスがチェック制約違反用に追加された
  • ActiveRecord::ExclusionViolationエラークラスが排他制約違反用に追加された
  • filter_attributesでフィルタされた属性がfilter_parametersでもフィルタされるようになった
  • connection.current_transaction.isolationAPIが現在のトランザクションの分離レベルをチェックできるようになった
  • #merge#orまたは#andと属性と SQL 文字列の混合で不正なクエリが生成される問題が修正された
  • スキーマダンパーが :ruby 形式でダンプする際にActiveRecord.dump_schemasを考慮するようになった
  • update_column/update_columnsメソッドに :touch オプションが追加された
  • Active Record バッチングが範囲を使用する際にさらに最適化された
  • インデックスとテーブル名の長さ検証のエラーメッセージに現在の文字長が含まれるようになった
  • PostgreSQL 用の rename_schema メソッドが追加された
  • アソシエーションの非推奨化サポートが実装された
  • PostgreSQL アダプタの create DB が locale_provider と locale をサポートするようになった
  • PostgreSQL で ntuples を使用して row_count を populateするようになった
  • 永続化されていないレコードが厳密に読み込まれた has_and_belongs_to_many アソシエーションに include? されるかどうかのチェックが修正された
  • ブロック内のすべてのプールのトランザクション分離を変更する機能が追加された
  • 順序に依存するファインダーメソッド(#first、#last)が順序値なしで呼び出された場合にActiveRecord::MissingRequiredOrderErrorが発生するようになった
  • 多態性 belongs_to アソシエーションで :class_name が無効になった
  • db:migrate:reset が複数データベースをサポートするようになった
  • ActiveRecord::Resultに affected_rows が追加された
  • 再試行可能な SqlLiterals を #where に渡すことができるようになった
  • insert_all/upsert_allで主キーのデフォルトが設定されるようになった
  • ActiveRecord::DatabaseConfigurations用のロードフックactive_record_database_configurationsが追加された
  • SQLite クエリで boolean カラムに TRUE と FALSE が使用されるようになった
  • サポートされる SQLite の最小バージョンが 3.23.0 に引き上げられた
  • 割り当てられた Active Record がアソシエーションをルックアップできるようになった
  • 暗号化が属性ごとにsupport_unencrypted_data: trueを設定することをサポートするようになった
  • モデルジェネレータがデータベース接続なしでカラムタイプを検証できるようになった
  • 署名付き ID 検証器がRails.application.message_verifiersで設定可能になった
  • PostgreSQLstructure_loadextra_flagsが前置されるようになった
  • implicit_order_columnで主キー/制約の追加をバイパスできるようになった
  • データベース設定でschema_formatを設定できるようになった
  • MySQL v8.0.0+ と MariaDB v10.6.0+でインデックスの無効化がサポートされた
  • ActiveRecord::Relation#reverse_orderimplicit_order_columnが尊重されるようになった
  • SQLite3 用のActiveRecord::Resultにカラムタイプが追加された
  • 読み取り専用ロールで悲観的ロックを使用した場合にActiveRecord::ReadOnlyErrorが発生するようになった
  • Rails アプリケーション外で SQLite3Adapter の dbconsole メソッドを使用する問題が修正された
  • ActiveRecord::PendingMigrationアクションで複数データベースのマイグレーションが修正された
  • 接続エラーで冪等なアソシエーションクエリの自動再試行が有効になった
  • sql.active_record 計装に allow_retry が追加された
  • PostgreSQL と SQLite3 で JOIN を使用した UPDATE のサポートが改善された
  • ActiveSupport::Testing::Parallelizationに before-fork フックが導入され、既存の接続がクリアされるようになった
  • PoolConfig が接続クラスへの参照を保持しなくなった
  • 非同期クエリを使用する際に SQL 通知が送信されない場合がある問題が修正された
  • PostgreSQL でダンプされたスキーマキャッシュの読み込みクエリが排除された
  • ActiveRecord::Coder::JSONがインスタンス化できるようになった
  • アソシエーション内の永続化されていないレコードでinsert_all/upsert_allを使用することが非推奨になった
  • index_exists?でカラム名がオプションになった
  • sql.active_record通知のペイロード名がeager loadingで「SQL」から「#{model.name} Eager Load」に変更された
  • 接続エラーで冪等な#exists?クエリの自動再試行が有効になった
  • update_allとサポートされていないメソッドの併用が非推奨になった
  • schema.rb内のテーブルカラムがアルファベット順にソートされるようになった
  • スキーマダンパー用のバージョンフォーマッターが導入された
  • シリアライズされた属性が比較可能としてマークできるようになった
  • MySQLのデフォルト関数がカラムのnullabilityを変更する際に削除される問題が修正された
  • SQLite拡張がconfig/database.ymlで設定できるようになった
  • ActiveRecord::Middleware::ShardSelectorが細かいデータベース接続切り替えをサポートするようになった
  • insert_all/upsert_all後にリレーションがリセットされるようになった
  • 並列テストデータベースのサフィックスに_Nが使用されるようになった
  • データベース接続が最近検証されたことを記憶するようになった
  • 複数のレコードのキャッシュカウンターをリセットできるようになった
  • sql.active_record通知にaffected_rowsが追加された
  • グループ化された計算でsumが修正された
  • データベースごとにトランザクションテストの有効/無効がサポートされるようになった
  • URL 設定を使用する際に query_cache 値がキャストされるようになった
  • NULLS NOT DISTINCTUNIQUE CONSTRAINTUNIQUE INDEXの両方で動作するようになった
  • PG::UnableToSend: no connection to the serverが接続関連の例外として再試行可能になった

Active Storage

  • GCP メタデータサーバーへの不要な呼び出しが削除された
  • ダイレクトアップロードの進行状況がサーバー処理時間を考慮するようになった
  • ActiveStorage::Filename#to_str#to_sに委譲されるようになった
  • config.active_storage.checksum_implementationを通じて代替MD5実装のサポートが追加された
  • Blob が関連する Attachment を自動保存しなくなった

Active Model

  • バリデーションコールバックに except_on: オプションが追加された
  • ActiveRecord::NormalizationActiveModel::Attributes::Normalizationにバックポートされた

Active Support

  • ActiveSupport::Cache::Store#namespace=#namespaceが追加された
  • 並列テスト実行用のparallel_worker_idヘルパーが作成された
  • ActiveSupport::Cache::Strategy::LocalCache::Middlewareのキャッシュが更新可能になった
  • ActiveSupport::EventReporter用のassert_events_reportedテストヘルパーが追加された
  • ActiveSupport::TimeZone#standard_nameメソッドが追加された
  • Rails.eventでアクセス可能なStructured Event Reporterが追加された
  • ActiveSupport::Loggerが#freezeフレンドリーになった
  • ActiveSupport::Gzip.compressが入力に基づいて決定論的になった
  • ActiveSupport::BacktraceCleaner#clean_locationsメソッドが追加された
  • CurrentAttributesとExecutionContextの状態管理がテストケースで改善された
  • ActiveSupport::BacktraceCleaner#first_clean_locationメソッドが追加された
  • FileUpdateCheckerEventedFileUpdateCheckerが Gem.path の変更を無視するようになった
  • ActiveSupport::BacktraceCleaner#first_clean_frameメソッドが追加された
  • CurrentAttributesインスタンスが常にクリアされるようになった
  • 並列テストでbefore_fork_hookのパブリック API が追加された
  • 並列テストデータベースの作成をスキップする機能が実装された
  • 最大キャッシュキーサイズの設定が可能になった
  • ActiveSupport::Cache::RedisCacheStoreで非ブロッキング削除にUNLINKコマンドが使用されるようになった
  • Cache#read_counterCache#write_counterが追加された
  • ActiveSupport::Testing::ErrorReporterAssertions#capture_error_reportsが導入された
  • ActiveSupport::ErrorReporter#add_middlewareが導入された
  • 実行ラッピングがすべての例外(Exceptionを含む)を報告するように変更された
  • ActiveSupport::Testing::Parallelization.before_fork_hookでテストワーカーフォーク直前に呼び出されるコールバックの宣言が可能になった
  • #freeze_timeテストヘルパーが日付または時間引数を受け入れるようになった
  • ActiveSupport::JSONがオプションを受け入れるようになった
  • ActiveSupport::Testing::NotificationAssertionsのassert_notificationがデフォルトでペイロードサブセットとマッチするようになった
  • nil.to_query("key")がkeyを返すようになった
  • ActiveSupport::Cache::RedisCacheStoreで :redis オプションが既に ConnectionPool の場合に Redis を ConnectionPool でラップしないようになった
  • ERB::Util.tokenizeが ERB タグを含まない文字列で完全な入力文字列と :PLAIN トークンを返すように変更された
  • ERB::Util.tokenizeでマルチバイト文字の前に ERB タグがある場合の不正なトークン化バグが修正された
  • ActiveSupport::Testing::NotificationAssertionsモジュールがActiveSupport::Notificationsのテストを支援するために追加された
  • ActiveSupport::CurrentAttributes#attributesが各呼び出しで新しいハッシュオブジェクトを返すようになった
  • ActiveSupport::JSON.encodeCIDR記法をサポートするようになった
  • ActiveSupport::FileUpdateCheckerが多くのファイル拡張子をチェックする際に高速化された

Active Job

  • ActiveJob::Serializers::ObjectSerializers#klassメソッドがパブリックになった
  • ActiveJob::Continuablez を使用してジョブを中断・再開できるようになった
  • enqueue_after_transaction_commitが有効な場合の ActiveJob エンキューコールバックの呼び出しがコミット後に延期されるようになった
  • ActiveJob::Base#retry_onと#discard_onにreport:オプションが追加された
  • ActiveJob::ConfiguredJob#perform_laterがブロックを受け入れるようになった
  • デシリアライゼーション時に以前にシリアライズされたジョブクラスが不明な場合により具体的なエラーが発生するようになった

Action Text

  • fill_in_rich_text_areaオプションが Capybara に転送されるようになった
  • アタッチメントアップロードの進行状況がサーバー処理時間を考慮するようになった
  • Trix 依存関係がベンダーファイルではなく action_text-trixgem で満たされるようになった
  • ActionText::RichText#embedsの割り当てが before_save から before_validation に変更された

Action Mailbox

  • Mail::Message に reply_to_address 拡張メソッドが追加された

非推奨および削除された機能

Action Pack

  • 以下が削除された
    • パラメータ名の先頭の角括弧([])をスキップする機能
    • クエリ文字列のセミコロン(;)区切りのサポート
    • 複数のパスに対するルート設定のサポート
  • Rails.application.config.action_dispatch.ignore_leading_brackets が非推奨になった

Active Record

  • 以下が削除された
    • SQLite3 アダプターの :retries オプション
    • MySQL の以下のカラムメソッド
      • :unsigned_float
      • :unsigned_decimal

Active Storage

  • azure ストレージサービスが削除された

Active Job

  • 以下が削除された
    • ActiveJob::Base.enqueue_after_transaction_commit:never, :always, :default に設定するサポート
    • Rails.application.config.active_job.enqueue_after_transaction_commit
    • 内部の SuckerPunch アダプタ