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-auditとconfig/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::Executorでrack.response_finishedコールバックのサポートが追加されたrescue_fromが呼び出されたときにログが生成されるようになった- Rails 設定の hosts からのホストリダイレクトが許可されるようになった
rate_limit.action_controller通知に追加のペイロードが含まれるようになった- 組み込みヘルスコントローラーに JSON サポートが追加された
- ブラウザからクラッシュでソースファイルを開けるようになった
- クエリ文字列キーが値と同様に有効なエンコーディングかチェックされるようになった
PublicExceptionsとDebugExceptionsで 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::CacheStoreにcheck_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_fieldとhidden_field_tagがカスタム autocomplete 値を受け入れるようになったcontent_security_policy_nonce_directives設定オプションで指定されたディレクティブの影響を受けるタグに nonce を自動的に追加する新しい設定content_security_policy_nonce_autoが追加された
Action Mailer
- deliver_all_laterが追加され、複数のメールを一度にエンキューできるようになった
Active Record
libpq >= 18とpg < 1.6.0の互換性問題により、cancel_any_running_queryでPG::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で設定可能になった PostgreSQLのstructure_loadでextra_flagsが前置されるようになったimplicit_order_columnで主キー/制約の追加をバイパスできるようになった- データベース設定で
schema_formatを設定できるようになった - MySQL v8.0.0+ と MariaDB v10.6.0+でインデックスの無効化がサポートされた
ActiveRecord::Relation#reverse_orderでimplicit_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 DISTINCTがUNIQUE CONSTRAINTとUNIQUE 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::NormalizationがActiveModel::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メソッドが追加されたFileUpdateCheckerとEventedFileUpdateCheckerが Gem.path の変更を無視するようになったActiveSupport::BacktraceCleaner#first_clean_frameメソッドが追加されたCurrentAttributesインスタンスが常にクリアされるようになった- 並列テストで
before_fork_hookのパブリック API が追加された - 並列テストデータベースの作成をスキップする機能が実装された
- 最大キャッシュキーサイズの設定が可能になった
ActiveSupport::Cache::RedisCacheStoreで非ブロッキング削除にUNLINKコマンドが使用されるようになったCache#read_counterとCache#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.encodeがCIDR記法をサポートするようになった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
- SQLite3 アダプターの
Active Storage
azureストレージサービスが削除された
Active Job
- 以下が削除された
ActiveJob::Base.enqueue_after_transaction_commitを:never,:always,:defaultに設定するサポートRails.application.config.active_job.enqueue_after_transaction_commit- 内部の
SuckerPunchアダプタ