個人でちょうど作ってるアプリを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で特に問題ないなら早くあげてしまったほうが良い感じがした。