自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

Rails7.1のnew_framework_defaultsをゆる~く確認【Agent Grow Advent Calendar 2023:13日目】

はじめに

こんにちは、Kasanoです。この記事はAgent Grow Advent Calendar 2023 13日目の記事です。
一部でオワコン呼ばわりされることもあるRuby on RailsやRubyですが全然そんなことなさそうな雰囲気を感じています。

そんなRailsですが今年10月にRails7.1がリリースされました。仕事でRailsを使っている以上はどうしても新しいメジャー・マイナーバージョンがリリースされる度に new_framework_defaults_*_*.rb ファイルの項目を1つ1つ確認する作業に追われるかと思われます。
そこで以下のような記事がggって探しますよね。

rails6.1で加わった新しいアプリケーション設定であるnew_framework_defaults_6_1.rbの各項目をさらっと解説

上記は6.1ですが、7.1版の日本語記事が意外と少なかったです。
「ならば自分が!」ということで、ゆるりと見ていきたいと思います。(7.1からの設定が多すぎるので深追いできてない設定も多いですがご容赦ください)

なお、new_framework_defaultsファイル自体の使い方については説明しません。(こちらのマネーフォワードさんの記事がわかりやすいので参考になさってください。)

new_framework_defaults_7.1.rbに記載のある設定

項目名 解説
add_autoload_paths_to_load_path = false $LOAD_PATHにautoload_pathを追加するかどうかの設定。
もともとzeitwerk(Railsで自動読み込みしてくれるやつ)が出てきてからはfalseにすることが推奨されていた。(参考)
action_dispatch.default_headers = {
“X-Frame-Options” => “SAMEORIGIN”,
“X-XSS-Protection” => “0”,
“X-Content-Type-Options” => “nosniff”,
“X-Permitted-Cross-Domain-Policies” => “none”,
“Referrer-Policy” => “strict-origin-when-cross-origin”
}
従来のdefault_headersから、 Internet Explorerでしか使われていない X-Download-Options ヘッダーが削除された。
ちなみにこのヘッダーはダウンロードしたファイルをブラウザのファイルオープンダイアログに表示するかどうかの設定。(参考
action_controller.allow_deprecated_parameters_hash_equality = false ActionController::Parameters#== にHashの引数を渡したときにWARNINGが出るかどうかの設定。今後はデフォルトではfalseなのでWARNINGが出なくなる。
active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256 Active Record Encryptionで利用するダイジェスト用アルゴリズムの設定。
従来はSHA1だった。
active_redord.run_commit_callbacks_on_first_saved_instances_in_transaction = false transactional内で同じレコードに対して変更処理を複数回実行した場合に、callback(after_commit・after_rollback)には最初に更新した場合のインスタンスが渡っていたが、falseに設定すると最新の状態のインスタンスを渡すようになる。
active_record.sqlite3_adapter_strict_strings_by_default = true SQLite3Adapterを”strict strings”モードで利用するかどうかの設定
active_record.allow_deprecated_singular_associations_name = false この設定をtrueにすると、単数形の関連付け名をwhereで複数形の名前で参照しても非推奨警告を表示しなくなる。
この設定をfalseにするとパフォーマンスが向上するとのことなのでfalse推奨。
active_job.use_big_decimal_serializer = true ジョブの引数にBigDecimalを渡す場合に、ラウンドトリップ(元に戻ること)を保証するBigDecimalシリアライザを有効にするかどうかの設定。このシリアライザを使わない場合、一部のキューアダプタがBigDecimal引数をラウンドトリップ不可能な文字列としてシリアライズすることがある。
active_support.raise_on_invalid_cache_expiration_time = true Rails.cacheのfetchまたはwriteに、無効なexpires_atまたは expires_in時刻を指定した場合に、ArgumentErrorを発生させるかどうかの設定。
active_record.query_log_tags_format = :sqlcommenter QueryLogsのタグに使うフォーマッタの設定。有効な値は:sqlcommenter または :legacy のどちらか。
active_support.message_serializer = :json_allow_marshal ActiveSupport::MessageEncryptorおよびActiveSupport::MessageVerifierインスタンスで利用するデフォルトのシリアライザの設定。
ちなみにRails7.1からはmsgpack gemを使用したActiveSupport::MessagePackが利用できるようにようになっており、こちらはより高速かつデータが軽量になるらしい。(が、そのためにgem追加が必要)
active_support.use_message_serializer_for_metadata = true メッセージデータとメタデータを一緒にシリアライズするときのパフォーマンスの最適化を有効にする設定。これによりメッセージのフォーマットが変更されるため、この方法でシリアライズされたモデルは古いバージョンのRails(< 7.1)では読み込めなくなるのでローリングデプロイを行う場合は、次回デプロイ時に有効化する必要がある。
if Rails.env.local?
Rails.application.config.log_file_size = 100 * 1024 * 1024
end
develpment or test環境のログファイルの最大サイズの設定。
ちなみにRails.env.local?はrails7.1から追加されたものでdevelopment or test のときにtrueとなる。(参考
active_record.raise_on_assign_to_attr_readonly = true attr_readonly属性への代入時にraiseするかどうかの設定。
ちなみに従来の動作は、代入しても特に何の例外もraiseされなかったが変更がDBに書き込まれなかった。
active_record.belongs_to_required_validates_foreign_key = false falseにすると、親が必須である場合に、親に関連するカラムについてのみ存在をバリデーションするようになる。

これはTechRachoさんの説明がめちゃくちゃわかりやすいので、そちらをご参照ください→(参考

precompile_filter_parameters = true ActiveSupport::ParameterFilter.precompile_filtersを利用するconfig.filter_parametersのプリコンパイルを有効にする設定。
フィルタの個数や種類にもよるが、フィルタをプリコンパイルすることでパフォーマンスの向上が期待できるとのこと。
active_record.before_committed_on_all_records = true before_committed!コールバックの実行について、トランザクションに登録されたすべてのレコードでコールバックが実行するかどうかの設定。
ちなみに従来(false時)は、トランザクションに登録されている同じレコードのコピーが複数ある場合に、レコードの最初のコピーに対してのみコールバックを実行する。
active_record.default_column_serializer = nil カラムでシリアライザが明示的に指定されていない場合に使うシリアライザーの設定。
Railsの該当のissueにある通り、

YAML(従来のデフォルト)→ 任意のデータをシリアル化するには、パフォーマンスと効率だけでなくセキュリティの点でも多くの問題がある
json → Ruby で利用できるパーサーには不安定な動作があるため、適切ではなさそう

と、デフォルトのシリアライザの候補がどちらも微妙。
データベース内のデータをシリアル化することは大きな結果を伴う決定であるため、ユーザーが自分でその選択を行う必要があるのは良いことだから当面はデフォルト無しでよいだろう、という話にまとまった。

active_record.marshalling_format_version = 7.1 7.1に設定すると、Active RecordインスタンスをMarshal.dumpでより効率的にシリアライズ可能になる。これによりシリアライズ形式が変更されるため、この方法でシリアライズされたモデルは従来のRails(< 7.1)では読み込めなくなる。
active_record.run_after_transaction_callbacks_in_order_defined = true trueにするとafter_commitコールバックはモデル内で定義された順に実行される。従来のfalseの場合は逆順に実行される。
その他のコールバックは、prepend :true を使わない限りは、常にモデルで定義された順序で実行される。
active_record.commit_transaction_on_non_local_return = true return・break・throwがtransactionブロック内で実行された場合に、トランザクションがコミットされるかロールバックされるかを定義する。
falseの場合はロールバック、trueの場合はコミットされる。
active_record.generate_secure_token_on = :initialize モデルのhas_secure_token宣言の値が生成されるタイミングを制御する設定。
:initializeではモデルが初期化されたときに値が生成される。従来は:createでモデル作成時に値が生成されていた。
active_support.cache_format_version = 7.1 Rails.cacheが扱うキャッシュのフォーマットの設定。
Railsガイド だと「どの形式も前方互換性と後方互換性があります」とあるが、new_framework_defaults_7_1.rb には
「Changing this default means that all new cache entries added to the cache
will have a different format that is not supported by Rails 7.0 applications.」
と互換性が無いようなことが書いてありよくわからない。
action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor Action Viewで利用されるHTMLサニタイザの設定
action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor Action Textで利用されるHTMLサニタイザの設定
action_dispatch.debug_exception_log_level = :error リクエスト中にキャッチされない例外をログ出力する際に、ActionDispatch::DebugExceptionsミドルウェアで使うログレベルの設定。従来は:fatalだった。
dom_testing_default_html_version = :html5 Action View、Action Dispatch、rails-dom-testingのテストヘルパーで、デフォルトで使うHTMLパーサーを、HTML4パーサーにするかHTML5パーサーにするかの設定

以上です。

プロジェクトによっては例えばActionTextなんて使ってないよ!とかあると思うので関係ない設定も多々あるとは思いますが、それにしてもいつもより設定の数が多かったですね。

詳しく知りたい項目があれば Rails公式の設定項目の紹介ページ
をご覧ください(といってもそんな詳しく説明してくれてない設定も多いですがorz)☆

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

Kasano

エージェントグローでRuby案件やってます。
趣味は献血です。不足しがちなO型を提供したい、、、が、最近脈が早くて献血できないことが多いので困ってます。

記事一覧