はじめに
こんにちは、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(従来のデフォルト)→ 任意のデータをシリアル化するには、パフォーマンスと効率だけでなくセキュリティの点でも多くの問題がある と、デフォルトのシリアライザの候補がどちらも微妙。 |
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)☆