2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Tips】Railsのバージョンアップ時にload_defaultsを更新し忘れる問題に気付きやすくする

Last updated at Posted at 2024-07-24

解決したい問題

既存のRailsアプリケーションをバージョンアップする場合、config/application.rbconfig.load_defaultsも(どこかのタイミングで)更新する必要があります。

config/application.rb
   class Application < Rails::Application
     # Rails 7.0から7.1にバージョンアップする
-    config.load_defaults 7.0
+    config.load_defaults 7.1

しかし、この設定をうっかり更新し忘れて「よし、Rails 7.1にアップデートできたぞ!🙌」と喜んでいたら、実はload_defaultsが7.0のままだった😱という問題が起こる可能性があります。

というか、僕は先日やらかしました、はい😂 (再度Rails 7.1向けのプログラム修正と動作確認を余儀なくされました……)

改善策

この問題に気付きやすくするように、config/application.rbに以下のコードを追加しました。

config/application.rb
 config.load_defaults 7.1
+unless config.loaded_config_version.to_f == Rails::VERSION::STRING.to_f
+  warn "Current Rails version is #{Rails::VERSION::STRING}, but loaded config version is #{config.loaded_config_version}"
+end

こうするとアプリケーションの起動時やテストの実行時に以下のような警告が出力されて更新し忘れに気付きやすくなります。

例: Rails 7.1にアップデートしたのにconfig.load_defaultsが7.0のままだった場合

Current Rails version is 7.1.3.4, but loaded config version is 7.0

この対応の考慮点

config.load_defaultsはRailsのバージョンを上げたら必ず同時に上げないといけないものではありません。
状況によってはRails 7.1でもあえてconfig.load_defaultsは7.0のまま本番リリースし、しばらく運用してから7.1に変更する、というケースもありえます。

その場合は「あえて古いバージョンにしているのに毎回警告が出てうっとうしい」というデメリットが発生します。

とはいえ、そのうっとうしさよりも、うっかり更新し忘れる問題の方が怖いので僕はこの設定を入れるようにしました。

まとめ

というわけでこの記事ではRailsのバージョンアップ時にload_defaultsを更新し忘れる問題に気付きやすくするTipsを紹介しました。

僕みたいにうっかり更新し忘れるのはイヤだ!という人は参考にしてみてください。

おまけ

最初は「この警告をRails自身が出してくれたら嬉しいのに」と思いpull requestを送ってみましたが、考慮点に書いたように「あえて古いバージョンを指定するケースもある(というか、その手順が推奨)なのでNG」となりました。残念😭

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?