記事の内容
タイトルにある通り、5年間改修が一度もはいらず放置されていたプロジェクトがなぜかこのタイミングで脆弱性診断に引っかかってしまい自分が担当することになりました。railsのバージョン上げることで解消しそうなため対応しました。
その際に、発生したerror等をまとめていこうと思います。
rails app:update
は実行したものの上書きできなかったため発生したものもありますが、ご容赦いただけますと。。
環境
改修前:ruby: 2.2.8 → 改修後:2.7.6
改修前:rails: 4.2.8 → 改修後:6.1.7.6
method_missing': undefined method
raise_in_transactional_callbacks=' for ActiveRecord::Base:Class (NoMethodError)
このエラーはraise_in_transactional_callbacks
というメソッドが ActiveRecord::Base クラスに存在しないことを示しています。具体的には、NoMethodError が発生しています。
Rails 4.1 で導入され、Rails 5.0 で非推奨となり、Rails 5.1 で削除されました。
そのため今回発生しました。
解決策
config/application.rb よりraise_in_transactional_callbacks
を使用しているコードを削除しました。
Rails 5.0以降では、raise_in_transactional_callbacks= はデフォルトで有効になっています。
undefined method `alias_method_chain' for String:Class (NoMethodError)
Did you mean? alias_method
このエラーはalias_method_chain
というメソッドが String クラスに存在しないため発生しました。このメソッドは先程同様Rails 5.0 で非推奨となり、Rails 5.1 で削除されました。
解決策
そのためprepend
に置き換えることで対応しました。
参考記事は以下です。
https://qiita.com/rorensu2236/items/3f94ff653ba0c45141a7
NoMethodError (undefined method `before_filter'...
before_filter
も同じくRails 5.0 で非推奨となり、Rails 5.1 以降では削除されました。
解決策
before_filter
をbefore_action
に置き換えます。
参考
https://pikawaka.com/rails/before_action
※skip_before_filter
も同様にskip_before_action
に置き換えました。
NoMethodError: undefined method `new' for BigDecimal:Class
decimal型を使用しているカラムを使用した際に発生しました。
Ruby2.7からRubyで使われているgem bigdecimalのバージョンが2.0.0になってるそうです。
解決策
以下のようにbigdecimalのバージョンを2.0.0未満にすればBigDecimal.newが使えようになりました。
gem "bigdecimal", "1.4.4"
参考
https://zenn.dev/harasho/articles/undefined-method-new-for-big-decimal-class
ActionView::MissingTemplate
その1
render nothing: true
がRails 5.1以降では削除されています。
解決策
render body: nil
のように修正
その2
render text
オプションは、Rails 5.1以降では削除されています。
解決策
render plain
のように修正
終わりに
rubyのバージョンはマイナーアップデートだったので変更はほとんどなかったと思います。
ただ、railsはメジャーアップデートしたので結構errorがでて驚きました。
特にrails5.1で削除されたものが多かったみたいです。
それだけ重要なアップデートだったのだと。。
各プロジェクトにて、少しづつ上げていったほうが後々楽だなと感じました。