2024/12/13 Rails アップデートテクニック、1
今の所属に来てからけっこう Rails のアップグレードをやってました
2022年に Rails LTS で 5 系だったアプリケーションをエイッと Rails 6 に上げたのを皮切りにして、そのあとマイナーバージョンはもちろん、メジャーバージョン上げるのもやってきてます 今年も Rails 6 から 7 に上げてたんですが、Warinig を放っておくことがどうしても許せない質なので、次期バージョンで廃止予定のWariningも潰しておきたいです
Rails 7 へのアップデートで以下のような変更がありました
モデルのdatetime型のカラムからto_sするような場面を考えると、 ActiveSupport::TimeWithZone#to_s あたりの影響は大きそうですよね
code:to_s.rb
8 pry(main)> User.find(1).created_at.to_s User Load (3.6ms) SELECT users.* FROM users WHERE users.id = 1 LIMIT 1
DEPRECATION WARNING: Using a :default format for TimeWithZone#to_s is deprecated. Please use TimeWithZone#to_fs instead. If you fixed all places inside your application that you see this deprecation, you can set ENV['RAILS_DISABLE_DEPRECATED_TO_S_CONVERSION'] to "true" in the config/application.rb file before the Bundler.require call to fix all the callers outside of your application. (called from <main> at bin/rails:4)
7ではWariningが出るにとどまりますが、いずれやることになるので対応しておくことにこしたことはありません
to_s から to_formatted_s のエイリアスである to_fs にできると良さそうです
refs:
どうやって書き換えようかと思ったところ、同僚が「モンキーパッチ」書いてテストを落とすと良さそうというのでトライです
code:patch.rb
class ActiveSupport::TimeWithZone
class ErrorDepreCatedToSConversation < StandardError; end
alias origin_to_s to_s
def to_s(format = :default)
raise ErrorDepreCatedToSConversation if format == :default
origin_to_s(format)
end
end
まあ落ちます落ちます、テストが。
暗黙的に JSON シリアライズする場面
暗黙的に HTML で文字列化する場面
などのケースが多く検出されました
地道につぶしていくほかないわけのでつぶしきって完了しました
ほとんど to_s の修正だけがメインのアップグレードだった気がする
https://scrapbox.io/files/675c0dedc6d7bc3a2f3a1bc1.png
今日は以上です。