zenet_logo

-株式会社ゼネット技術ブログ-

Railsバージョンアップ時に発生したエラーと解消方法について



ゼネットの高澤です。

業務でRuby on Railsのバージョンアップ対応を行い、
その際に発生したエラーや解決方法を紹介したいと思います。

はじめに

動作環境

Ruby: 3.2.5 → 3.4.4へバージョンアップ
Rails: 7.0 → 7.1 → 7.2 → 8.0へ段階的にバージョンアップ

本記事のフォーカス

今回は下記に示すバージョンアップ手順のうち、2と3のバージョンアップ対応時のエラー解消について、一部を紹介します。

  1. テスティングとカバレッジ確認
  2. Rubyのバージョンアップ
  3. Railsのバージョンアップ
  4. アップグレードタスクを実行
  5. load_defaultやnew_framework_defaults_x_x.rbを設定する
  6. 動作確認と修正

railsguides.jp

qiita.com

default gemsからbundled gemsへ変更によるエラー

まず、default gemsとbundled gemsについて解説します。

  • default gems

     default gemsはRubyに標準添付されており、特にGemfileに記述せずとも利用可能なgemです。
    ruby --disable-gemsなど一部環境では利用不可になる点にも注意が必要です。
    Rubyインタプリタを変更することなくgem updatebundle updateでアップデートすることができます。
    また、Bundler管理下において、bundle installしなくても初めからrequireして利用できます

  • bundled gems

     bundled gemsは、Rubyにバンドルはされるが、明示的にGemfileに追加しなければ利用できないgem群です(Ruby 3.4から一部変更)。
    元々 default gems だったものが移行しています。
    Bundler管理下において、利用する場合は明示的にGemfileに記述し、bundle installすることでrequireして利用することができます

gihyo.jp

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

www.ruby-lang.org

Rails等のBundlerを使用するシステムでは、bundled gemsは3rd party gemと同様で、Gemfileに指定しない限り、requireすることができません。

zenn.dev

実際に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に修正することで、エラーを解消しました。

qiita.com

開発小話

bundle installrails s、仮の動作確認でエラーなく動いたから、ホッと一安心...
という訳にもいかず、実はログを確認するとSQL実行完了後にNoMethodErrorやサーバー起動後にwarningが起きていて、危うく見逃しそうになったことがありました。

コマンド実行時のログだけでなく、操作時のログも見落とさないように、予め確認事項を決めておくことやLogger設定を確認しておくことも大事ですね。

最後に

実際にRailsバージョンアップの業務で発生したエラーとその解消方法の一部を紹介しました。

基本的なことですが1つずつエラーを確認し、PRやIssue等から調査や修正、動作確認を繰り返して解消していくことになると思います。

また、各バージョンでのリリースノートを確認すると実際にエラーが発生した際に、調査の参考になるので、目を通しておくことも大切です。

他にも良い対応や調査方法がありましたら、コメントいただけると幸いです!

今回は紹介しきれなかったnew_framework_defaults対応や動作確認等のエラー解消についても、折りを見て紹介したいと思います!

参考リンク

railsguides.jp

qiita.com

gihyo.jp

www.ruby-lang.org

zenn.dev

qiita.com

railsguides.jp