以前とあるプロジェクトのRailsバージョンを6.0 -> 6.1 -> 7.0に順次上げたので、いくつかのポイントについて簡単に記事にしようと思います。
🔗 基本の流れ
既に有用なガイドがいくつかあり、これらを参考にすれば失敗することはないと思います。
細かくPRを出したかったので、ブランチの積み方はこんな感じにしました。
develop ━ feature/rails_6-1 ┳ feature/rails_6-1_update_xxx
┣ feature/rails_6-1_update_rails
┗ feature/rails_6-1_fix_spec
feature/rails_6-1
ブランチ(Rails 7.0へのアップグレードの場合は feature/rails_7-0
ブランチ)にPRを集約していき、アップグレードのためのコード修正が完了したら develop
ブランチにマージしました。
人数の多いプロジェクトだとコンフリクト回避のための調整などが必要になるかもしれません。自分が今回携わったプロジェクトでは開発メンバーが多くなく、その辺りの調整は比較的容易でした。
また、特にアップグレード作業を初めて行う場合、作業予定を予め文書化しておくと役立つと思います(実際役立った)。
- 経験者にレビューしてもらうことで、事前に問題点を見つけることができる
- 文書をガイドにしてアップグレード作業をすることで、作業中に迷子にならない
という利点があります。
🔗 6.0 -> 6.1 へのアップグレードについて
対応が必要になった具体的な部分について触れていきます。
🔗 Gemfileのデフォルトgem変更
rails new
したとき、 Gemfile
にデフォルトで追加されているgemがありますが、あれらはRailsの新バージョンで削除、または追加されることがあります。
各差分は https://railsdiff.org/ を参照すると分かります。今回は基本的にデフォルトgemの変更に追従しました。
6.0 -> 6.1で変更されたデフォルトgemと、対応するPRは以下の通りです。
🔗 Active Storage関連のテーブルのschema変更
rails app:udpate
を実行するとmigrationが自動で生えてきます。
作業としてはそのまま rails db:migrate
するだけです。
migration実行による変更内容は以下の二つです。
🔗 ActiveModel::Errors
as a hash のdeprecation
errors
をHashとして呼ぶことが非推奨になりました。
※ Rails 7.0からは構文エラーになります。
# deprecated
@user.errors.each do |attribute, message|
errors.add(attribute, message)
end
# ◯
@user.errors.each do |error|
errors.add(error.attribute, error.message)
end
🔗 6.1 -> 7.0 へのアップグレードについて
🔗 Gemfileのデフォルトgem変更
6.0 -> 6.1のときと同様です。
debug
(追加) /byebug
(削除):#43187listen
(削除):#42985spring
(削除):#42997rack-mini-profiler
(削除):#42986
🔗 ActiveStorage関連のテーブルのschema変更
これも6.0 -> 6.1のときと同様です。
migration実行による変更内容は以下です。
- 複数のblobを連結できるようになった:#41544
🔗 button_to
が生成するタグの変更
button_to
が生成するタグがデフォルトで button
になりました。
System Specのmatcherで input
タグを探すなどしていると、タグの修正が必要になります。
🔗 外部ページへのリダイレクトの挙動変更
OAuth 2.0の認可などで外部ページにリダイレクトしたくなることがあると思いますが、Rails 7.0ではオープンリダイレクト攻撃を防ぐために、外部ページへのリダイレクトはデフォルトで無効になっています。
一部のページに限って有効にするには、リダイレクトのオプションに allow_other_host: true
を追加します。
redirect_to authorize_uri, allow_other_host: true unless sign_in?
以上です。