
ゼネットの高澤です。
業務でRuby on Railsのバージョンアップ対応を行い、
その際に発生したエラーや解決方法を紹介したいと思います。
はじめに
動作環境
Ruby: 3.2.5 → 3.4.4へバージョンアップ
Rails: 7.0 → 7.1 → 7.2 → 8.0へ段階的にバージョンアップ
本記事のフォーカス
今回は下記に示すバージョンアップ手順のうち、2と3のバージョンアップ対応時のエラー解消について、一部を紹介します。
- テスティングとカバレッジ確認
- Rubyのバージョンアップ
- Railsのバージョンアップ
- アップグレードタスクを実行
- load_defaultやnew_framework_defaults_x_x.rbを設定する
- 動作確認と修正
default gemsからbundled gemsへ変更によるエラー
まず、default gemsとbundled gemsについて解説します。
- default gems
default gemsはRubyに標準添付されており、特にGemfileに記述せずとも利用可能なgemです。
ruby --disable-gemsなど一部環境では利用不可になる点にも注意が必要です。
Rubyインタプリタを変更することなくgem updateやbundle updateでアップデートすることができます。
また、Bundler管理下において、bundle installしなくても初めからrequireして利用できます。 - bundled gems
bundled gemsは、Rubyにバンドルはされるが、明示的にGemfileに追加しなければ利用できないgem群です(Ruby 3.4から一部変更)。
元々 default gems だったものが移行しています。
Bundler管理下において、利用する場合は明示的にGemfileに記述し、bundle installすることでrequireして利用することができます。
Ruby 3.4.0から以下のgemがdefault gemsからbundled gemsに変更されました。
- mutex_m 0.3.0
- getoptlong 0.2.1
- base64 0.2.0
- bigdecimal 3.1.8
- observer 0.1.2
- abbrev 0.1.2
- resolv-replace 0.1.1
- rinda 0.2.0
- drb 2.2.1
- nkf 0.2.0
- syslog 0.2.0
- csv 3.3.2
- repl_type_completor 0.1.9
Rails等のBundlerを使用するシステムでは、bundled gemsは3rd party gemと同様で、Gemfileに指定しない限り、requireすることができません。
実際にbundled gemsに変更されたgemのLoadErrorが発生しましたが、Gemfileに追加することでLoadErrorは解消されます。
LoadError: cannot load such file -- base64
Gemの非互換性によるエラー
Railsのアップデートによって、Gemの中には非互換性が生まれてしまい、エラーとなる場合があります。
実際にRailsと共にactive_recordも7.1.5.1にバージョンアップした結果、bullet gemに非互換性によってエラーとなったケースです。
Bundler::GemRequireError: There was an error while trying to load the gem 'bullet'. Gem Load Error is: Bullet does not support active_record 7.1.5.1 yet
このような場合はCHANGELOGを確認し、互換性を解消するバージョンに上げる必要があります。
今回はRails 8.0へ上げることが決まっていたため、最新の8.0.7へバージョンアップすることで解消しました。
gem 'bullet', "8.0.7"
廃止された機能の影響によるエラー
また、Railsのバージョンアップによって、廃止された機能のエラー解消も必要となる場合があります。
以下はRails 7.2から非推奨機能のTestFixtures.fixture_pathが削除され、fixture_pathを使用していた場合は、以下のエラーが表示されます。
NoMethodError: undefined method 'fixture_path=' for class
このような場合は、廃止された機能の代替機能がないか、変更箇所のPRやWeb記事等を調査し解消する必要があります。
今回は代替で用意されているfixture_pathsに修正することで、エラーを解消しました。
開発小話
bundle installやrails s、仮の動作確認でエラーなく動いたから、ホッと一安心...
という訳にもいかず、実はログを確認するとSQL実行完了後にNoMethodErrorやサーバー起動後にwarningが起きていて、危うく見逃しそうになったことがありました。
コマンド実行時のログだけでなく、操作時のログも見落とさないように、予め確認事項を決めておくことやLogger設定を確認しておくことも大事ですね。
最後に
実際にRailsバージョンアップの業務で発生したエラーとその解消方法の一部を紹介しました。
基本的なことですが1つずつエラーを確認し、PRやIssue等から調査や修正、動作確認を繰り返して解消していくことになると思います。
また、各バージョンでのリリースノートを確認すると実際にエラーが発生した際に、調査の参考になるので、目を通しておくことも大切です。
他にも良い対応や調査方法がありましたら、コメントいただけると幸いです!
今回は紹介しきれなかったnew_framework_defaults対応や動作確認等のエラー解消についても、折りを見て紹介したいと思います!
