個人プロジェクトをRails6からRails7にアップグレードした

個人でちょうど作ってるアプリをRails6から7にあげたのでその時に感じたことを書いていく。

実装としてはCRUDがいっぱいある管理画面とフロントエンドから参照する用のREST APIがいくつか立っている。

なおアップグレード日は2022/1/2。

手順

まずはGemfileのRailsのバージョンを7.0.0にする。

# frozen_string_literal: true

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '3.0.1'

gem 'rails','7.0.0' <---ここ

Rubyは2.7以上が必須なので、Rubyのバージョンが低いなら対応しておくこと。僕はRuby3だったので問題はなかった。

変更したらbundle update

$ bundle update
----
----
Fetching actiontext 7.0.0 (was 6.1.4.4)
Fetching actionmailbox 7.0.0 (was 6.1.4.4)
Installing actionmailbox 7.0.0 (was 6.1.4.4)
Installing actiontext 7.0.0 (was 6.1.4.4)
Fetching rails 7.0.0 (was 6.1.4.4)
Installing rails 7.0.0 (was 6.1.4.4)

なに食わぬ顔でアップグレードされるgemもあるが、いくつか動かないのもある。(後述)

これが終わったらrails app:updateを実行。

    conflict  config/boot.rb
rails aborted!/config/boot.rb? (enter "h" for help) [Ynaqdhm]
Interrupt:
/app/bin/rails:9:in `<top (required)>'
/app/bin/spring:15:in `<top (required)>'
Tasks: TOP => app:update => app:update:configs
(See full trace by running task with --trace)
/app # rails app:update
    conflict  config/boot.rb
Overwrite /app/config/boot.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/boot.rb
       exist  config
    conflict  config/application.rb
Overwrite /app/config/application.rb? (enter "h" for help) [Ynaqdhm] h
        Y - yes, overwrite
        n - no, do not overwrite
        a - all, overwrite this and all others
        q - quit, abort
        d - diff, show the differences between the old and the new
        h - help, show this help
        m - merge, run merge tool
Overwrite /app/config/application.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/application.rb
    conflict  config/environment.rb
Overwrite /app/config/environment.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/environment.rb
       exist  config/environments
    conflict  config/environments/development.rb
Overwrite /app/config/environments/development.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/environments/development.rb
    conflict  config/environments/production.rb
Overwrite /app/config/environments/production.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/environments/production.rb
    conflict  config/environments/test.rb
Overwrite /app/config/environments/test.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/environments/test.rb
       exist  config/initializers
    conflict  config/initializers/assets.rb
Overwrite /app/config/initializers/assets.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/initializers/assets.rb
    conflict  config/initializers/content_security_policy.rb
Overwrite /app/config/initializers/content_security_policy.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/initializers/content_security_policy.rb
    conflict  config/initializers/cors.rb
Overwrite /app/config/initializers/cors.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/initializers/cors.rb
    conflict  config/initializers/filter_parameter_logging.rb
Overwrite /app/config/initializers/filter_parameter_logging.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/initializers/filter_parameter_logging.rb
    conflict  config/initializers/inflections.rb
Overwrite /app/config/initializers/inflections.rb? (enter "h" for help) [Ynaqdhm] Y
       force  config/initializers/inflections.rb
      create  config/initializers/new_framework_defaults_7_0.rb
      create  config/initializers/permissions_policy.rb
File unchanged! The supplied flag value not found!  config/application.rb
       exist  bin
    conflict  bin/rails
Overwrite /app/bin/rails? (enter "h" for help) [Ynaqdhm] Y
       force  bin/rails
    conflict  bin/rake
Overwrite /app/bin/rake? (enter "h" for help) [Ynaqdhm] Y
       force  bin/rake
    conflict  bin/setup
Overwrite /app/bin/setup? (enter "h" for help) [Ynaqdhm] Y
       force  bin/setup
       rails  active_storage:update

重要なファイルをRails7仕様にされる。上書きを選んでいくけれど、これ、production.rbとかcor.rb、application.rbまで上書きしていくので、当然大事な設定もまっさらになってしまう。

VSCodeだとこういうのがあって差分をエディタ上でみれるので、大事な部分をコピペするとかで確認しながら作業すすめるが吉。だいたい25ファイルくらい。

なにごともなければこれでrails sなりdocker-compose upなりすればRails7になって起動する。

未対応Gem

bulletとannotateが動作しない。(20220102時点)

二つともdevelopment or test環境でしか使わないgemなのでまあちっと開発が不便になってしまうが対応の優先順位は低いかなと思う。

対応されているけど気をつけたいGem

DeviseがRails7をサポートしてるけどTurboを完璧にサポートしたわけではないっすと言っている。

TurboというのはTurbolinksの後継でHotwiredと呼ばれるものにある一機能。本来TurbolinksがやっていたことをHotwiredがやるようになったというわけ。

JavaScriptを使わないAPIベースのアプリなら気にすることはないと思うが、うちは管理画面がRails Viewを使っているので気になった。

DBのmigration

ActiveStorageを使ってる場合はいくつか走る。

僕が観測したところchecksumの項目のnullが許可されただけだった。

Rspec

rspecとrubocopは最新版でそのまま動作した。そして通過はしたがDBでいくつか警告がでるようになった。

これはマルチDBつかってないから気にすることはないけど、マルチDBのアプリはちと考えることありそう。

本番デプロイ

コマンドは変えずに実行したけど、ちゃんと成功した。

気のせいかどうかはわからないが、表示速度が上がった感じがする。6のときと計測しておけばよかったかな。

これは今度rails newして確かめてみるつもり。

まとめ

個人的な結論としては「rails viewを使ってないAPIのJsonを返すだけのアプリで、マルチDB使ってないならすぐアップデートしてもよさそう。開発系のgemで未対応がいくつかありそうなので気をつけること」というところだろうか。

開発系のGemで特に問題ないなら早くあげてしまったほうが良い感じがした。