new_framework_defaults_6_1.rbとは
railsバージョンアップの工程で、rails app:update
コマンドを実行すると、config/initializers/new_framework_defaults_6_1.rb
と言うファイルが作成されます。
このファイルにはrails6.0, 6.1間で変更される設定値が書かれています。
この記事の内容
実際にバージョンアップをする際は、このファイルの設定値を確認しながらバージョンアップを行うので内容を把握する必要があるため数行で各項目を解説していきます。
どのように使うかの詳細はこの記事では書きません。
config/initializers/new_framework_defaults_6_1.rwo
解説
Rails.application.config.active_record.has_many_inversing = true
has_manyでinverse_of:を追加した場合に関連付けのモデルを作成した時に、関連付けのモデルのコールバックが実行されてしまうバグフィックスがあったが、破壊的な変更になるためオプション設定できる様になった。
デフォルトではtrue
で、これまで通りコールバックが実行される。
See: https://github.com/rails/rails/pull/37413
https://github.com/rails/rails/pull/37429
Rails.application.config.active_storage.track_variants = true
ActiveStorageでvariantsの存在チェックでのオーバーヘッドが大きいためデフォルトで処理を廃止し、存在チェックを行いたい場合はオプションで設定できるようにした。
See: https://github.com/rails/rails/pull/37901
Rails.application.config.active_job.retry_jitter = 0.15
jitterがデフォルトで指定されるようになった。
デフォルト値を変更にしたい場合は値を書き換える。
See: https://github.com/rails/rails/pull/37923
Rails.application.config.active_job.skip_after_callbacks_if_terminated = true
ActibJobで、job実行時にcallback chainがhaltした場合、after_enqueue, after_perform を実行しないよう修正された。
これは、破壊的な変更になるため、デフォルトでは互換性を保つためにfalseになっている。(= haltしてもコールバックが実行される)
新しい挙動を有効化したい場合はtrueを指定する。
Rails.application.config.action_dispatch.cookies_same_site_protection = :lax
Cookieを書き込み時に、SameSite属性の値が指定される様になった。
デフォルトはLax。
Strictにしたい場合、:strict
を指定する。SameSiteを無効化したい場合は:none
を指定する。
この設定を有効にすると以前のバージョンとの互換性は失われます。ロールバックが困難になるため、:none
に設定しておきバージョンアップが安定したあと再度この指定を行うことをお勧めします。
Rails.application.config.action_controller.urlsafe_csrf_tokens = true
CSRFのエンコード方式がbase64からurlsafeなbase64に変更されました。
この設定を有効にすると以前のバージョンとの互換性は失われます。ロールバックが困難になるため、false
に設定しておきバージョンアップが安定したあと設定を削除しデフォルトの挙動true
へ移行することをお勧めします。
ActiveSupport.utc_to_local_returns_utc_offset_times = true
gem 'tzinfo'をv2にバージョンアップしたことでActiveSupport::TimeZone.utc_to_local
の返り値にUTC offsetが含まれようになった。
デフォルトはfalse
で返り値にUTC offsetが含まない。
Rails.application.config.action_dispatch.ssl_default_redirect_status = 308
GET, HEADリクエストをHTTPからHTTPSにリダイレクトするときに使用されるHTTPステータスコードをRFC7538に準拠した308にデフォルトを定義します。
See: https://tools.ietf.org/html/rfc7538
Rails.application.config.active_record.legacy_connection_handling = false
connected_to
メソッドをActiveRecord::Base
からだけでなく、抽象クラスからも呼び出せるようになりました。
抽象クラス内で複数のデータベース接続をするためにコレクションの切り替えを行います。
Rails.application.config.action_view.form_with_generates_remote_forms = false
form_with
ヘルパーで生成されるform
タグのdata-remote
属性のデフォルトがtrue
からfalse
になった。下位バージョンと互換性を保つためにはtrue
を設定する。
Rails.application.config.active_storage.queues.analysis = nil
config.active_storage.queue
は非推奨になり、config.active_storage.queues.analysis
, config.active_storage.queues.purge
に分割された。
ActiveStorageでオブジェクトがDBに登録されたときにActiveJob経由で、ファイルからメタデータを抽出しblobレコードのmetadataカラムに保存される。(このカラムはmini_magickを使って画像からheightやwidthを取り出すときによく使われる。)
このjobのキューがdefaultキューにしか投入できなかったが、このオプションでキューを指定できる様になった。
Rails.application.config.active_storage.queues.purge = nil
config.active_storage.queue
は非推奨になり、config.active_storage.queues.analysis
, config.active_storage.queues.purge
に分割された。
ActiveStorageのオブジェクトが指すファイルパスの更新時に古いファイルを削除するjobのキューがdefaultキューにしか投入できなかったが、このオプションでキューを指定できる様になった。
Rails.application.config.action_mailbox.queues.incineration = nil
処理が成功したInboundEmailのincinerate(削除)ActiveJobの実行キューが選択可能になりました。
Rails.application.config.action_mailbox.queues.routing = nil
InboundEmail受信時のルーティング処理をするActiveJobの実行キューが選択可能になりました。
非同期になっているのは他の処理を行なっている間にハングする時間をかけずに新しい受信メールを受け入れるため。
Rails.application.config.action_mailer.deliver_later_queue_name = nil
ActionMailerでのメールの非同期送信をするActiveJobの実行キューが選択可能になりました。
ファイル全文
# Be sure to restart your server when you modify this file.
#
# This file contains migration options to ease your Rails 6.1 upgrade.
#
# Once upgraded flip defaults one by one to migrate to the new default.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# Support for inversing belongs_to -> has_many Active Record associations.
# Rails.application.config.active_record.has_many_inversing = true
# Track Active Storage variants in the database.
# Rails.application.config.active_storage.track_variants = true
# Apply random variation to the delay when retrying failed jobs.
# Rails.application.config.active_job.retry_jitter = 0.15
# Stop executing `after_enqueue`/`after_perform` callbacks if
# `before_enqueue`/`before_perform` respectively halts with `throw :abort`.
# Rails.application.config.active_job.skip_after_callbacks_if_terminated = true
# Specify cookies SameSite protection level: either :none, :lax, or :strict.
#
# This change is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.1.
# Rails.application.config.action_dispatch.cookies_same_site_protection = :lax
# Generate CSRF tokens that are encoded in URL-safe Base64.
#
# This change is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.1.
# Rails.application.config.action_controller.urlsafe_csrf_tokens = true
# Specify whether `ActiveSupport::TimeZone.utc_to_local` returns a time with an
# UTC offset or a UTC time.
# ActiveSupport.utc_to_local_returns_utc_offset_times = true
# Change the default HTTP status code to `308` when redirecting non-GET/HEAD
# requests to HTTPS in `ActionDispatch::SSL` middleware.
# Rails.application.config.action_dispatch.ssl_default_redirect_status = 308
# Use new connection handling API. For most applications this won't have any
# effect. For applications using multiple databases, this new API provides
# support for granular connection swapping.
# Rails.application.config.active_record.legacy_connection_handling = false
# Make `form_with` generate non-remote forms by default.
# Rails.application.config.action_view.form_with_generates_remote_forms = false
# Set the default queue name for the analysis job to the queue adapter default.
# Rails.application.config.active_storage.queues.analysis = nil
# Set the default queue name for the purge job to the queue adapter default.
# Rails.application.config.active_storage.queues.purge = nil
# Set the default queue name for the incineration job to the queue adapter default.
# Rails.application.config.action_mailbox.queues.incineration = nil
# Set the default queue name for the routing job to the queue adapter default.
# Rails.application.config.action_mailbox.queues.routing = nil
# Set the default queue name for the mail deliver job to the queue adapter default.
# Rails.application.config.action_mailer.deliver_later_queue_name = nil
参考