Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 6.0 -> 6.1 -> 7.0アップグレードの備忘録

以前とあるプロジェクトの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は以下の通りです。

  • spring-watcher-listen (削除):#36377
  • rack-mini-profiler (追加):#38701
    • ※ Rails 7.0では結局削除されます

🔗 Active Storage関連のテーブルのschema変更

rails app:udpate を実行するとmigrationが自動で生えてきます。
作業としてはそのまま rails db:migrate するだけです。
migration実行による変更内容は以下の二つです。

  • has_one_attached にserviceオプションが設定できるようになった:#34935
  • DBアクセスによるvariantの存在チェックが可能になった:#37901

🔗 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 (削除):#43187
  • listen (削除):#42985
  • spring (削除):#42997
  • rack-mini-profiler (削除):#42986

🔗 ActiveStorage関連のテーブルのschema変更

これも6.0 -> 6.1のときと同様です。
migration実行による変更内容は以下です。

  • 複数のblobを連結できるようになった:#41544

🔗 button_to が生成するタグの変更

§ 3.11.18 config.action_view.button_to_generates_button_tag
-- Configuring Rails Applications — Ruby on Rails Guides

button_to が生成するタグがデフォルトで button になりました。
System Specのmatcherで input タグを探すなどしていると、タグの修正が必要になります。

🔗 外部ページへのリダイレクトの挙動変更

OAuth 2.0の認可などで外部ページにリダイレクトしたくなることがあると思いますが、Rails 7.0ではオープンリダイレクト攻撃を防ぐために、外部ページへのリダイレクトはデフォルトで無効になっています。

§3.10.16 config.action_controller.raise_on_open_redirects -- Configuring Rails Applications — Ruby on Rails Guides

一部のページに限って有効にするには、リダイレクトのオプションに allow_other_host: true を追加します。

redirect_to authorize_uri, allow_other_host: true unless sign_in?

以上です。



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。