【Rails】config.load_defaultsで指定したバージョンのデフォルト設定を読み込む

## はじめに

Railsアプリケーションのバージョンアップ作業に携わる中で、`config.load_defaults`という設定オプションについて学びました。
<br>

そこでこの記事では`config.load_defaults`の役割や使い方、バージョンアップ作業時の取り扱いについてまとめます。
<br>

対象読者は次のとおりです。
<br>

- Railsの設定まわりに興味のあるエンジニア
- 歴史のあるRailsアプリケーションに携わっている（Rails5.0以前）
- Railsのバージョンアップ前に設定ファイルをリファクタリングしたいエンジニア

## `config.load_defaults`とは？

`config.load_defaults`とは、**指定したRailsバージョンのデフォルト設定を一括で読み込むための設定です。**
<br>

`config/application.rb`に記述されています。
<br>

下記はRails7.2で`rails new`した時点の`config/application.rb`です。
<br>

```ruby:config/application.rb
require_relative "boot"

require "rails/all"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module SampleApp
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.2

# Please, add to the `ignore` list any other `lib` subdirectories that do
# not contain `.rb` files, or that should not be reloaded or eager loaded.
# Common ones are `templates`, `generators`, or `middleware`, for example.
config.autoload_lib(ignore: %w[assets tasks])

# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
#
# config.time_zone = "Central Time (US & Canada)"
# config.eager_load_paths << Rails.root.join("extras")
end
end
```
<br>

デフォルトの設定ではアプリケーションの要件を満たせない場合、値を個別に上書きすることも可能です。
<br>

```ruby:config/application.rb
require_relative "boot"

require "rails/all"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module SampleApp
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.2

# Please, add to the `ignore` list any other `lib` subdirectories that do
# not contain `.rb` files, or that should not be reloaded or eager loaded.
# Common ones are `templates`, `generators`, or `middleware`, for example.
config.autoload_lib(ignore: %w[assets tasks])

# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
#
# config.time_zone = "Central Time (US & Canada)"
# config.eager_load_paths << Rails.root.join("extras")

# load_defaults で設定されるデフォルト値は "UTC" だが東京に変更
config.time_zone = 'Asia/Tokyo'
end
end
```
<br>

バージョン毎にどのようなデフォルト値が用意されているかは、Railsガイドで確認できます。
<br>

https://railsguides.jp/configuring.html#rails%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%94%E3%81%A8%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%80%A4

## `config.load_defaults`で得られること

`config.load_defaults`を採用することで、以下の利点があります。

### 1. 個別設定の可視化

Rails のデフォルト設定とプロジェクト固有の設定を明確にできます。
<br>

**「普通のRailsアプリケーションとはどこが異なるか？」がコードとして可視化される**ため、設定ファイルの管理が容易になります。

### 2. Rails 標準への準拠

可能なかぎり Rails の標準設定に寄せた方が、フレームワークの最新機能や最適化の恩恵を受けやすいです。
<br>

アプリケーションのパフォーマンス向上やセキュリティ面の強化などが期待できます。

### 3. メンテナンスの効率化

デフォルト設定を一括で適用することで、個別の設定変更が減少し、設定ファイルがシンプルになります。
<br>

その結果として、バージョンアップ対応時のメンテナンス作業の効率化が可能です。

## 既存のRailsアプリケーションへの導入

`config.load_defaults`はRails 5.0より導入された機能です。
<br>

Rails 5.0以前から運用されているアプリケーションでは`config.load_defaults`が使用されていない可能性があります。
<br>

この場合は`config/application.rb`に`config.load_defaults(5.0)`と記述するだけで、デフォルト設定が適用されます。
<br>

```ruby:config/application.rb
require_relative "boot"

require "rails/all"

Bundler.require(*Rails.groups)

module SampleApp
class Application < Rails::Application
config.load_defaults(5.0)  # 記述を追加

# ...

end
end
```
<br>

`load_defaults`で採用されているデフォルト設定で問題ない場合、個別設定の記述は不要なので削除しましょう。
<br>

デフォルト値では要件を満たせない設定のみ、既存の記述をそのまま残しておけば、アプリケーションの挙動に影響は与えません。
<br>

つまり、`load_defaults`を新規に採用することで、設定ファイル`config/application.rb`のリファクタリングが可能なのです。

### 注意点

たとえばRails 7.0までバージョンアップしたい場合、理論上は`config.load_defaults(7.0)`と目標のバージョンをいきなり指定して一気に変更することもできます。
<br>

しかし、実務ではレビュー負荷や問題発生のトラブルシューティングなどを考慮し、段階的に変更していく方が安全です。
<br>

まずは`config.load_defaults(5.0)`を指定し、`5.1`, `5.2`, `6.0`, `6.1`, `7.0`.....と目標のバージョンまで段階的に少しずつ変更していくのが良いでしょう。

## おわりに

`config.load_defaults`は、設定ファイルの見通しを改善し、アプリケーションのメンテナンス性を向上させる便利な機能です。
<br>

Rails 5.0以降の新規プロジェクトでは標準で使用されており、既存のプロジェクトでも段階的に導入することができます。
<br>

バージョンアップ作業を通じてRailsへの理解が深まりました。
<br>

またこの記事に誤りがありましたらコメントにてご指摘いただけますと幸いです。

### 参考資料

https://railsguides.jp/configuring.html#rails%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%94%E3%81%A8%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%80%A4

https://api.rubyonrails.org/classes/Rails/Application/Configuration.html#method-i-load_defaults