はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー20日目です。
今開発しているアプリがRails6系なので、これを7系にアップデートするにあたり必要な情報を集めます。
前提
テストコード必須
アプリケーションのコアとなるロジックを中心に、挙動がおかしくならないかを自動で確認するテストを書いておく。
テストがないと、アプリの挙動全てを手動で確認しなければならない。普段から行っていなければ漏れが出るし、アプリの機能の規模が大きくなれば全て手動でやるのはコストがかかる。
実施手順
公式のアップグレードガイドに目を通し、確認が必要そうなところに目星をつけておく
ブランチを作成する
Railsのバージョンアップの際は、以下のような命名規則にするとよさそう。
develop ━ feature/rails_update_6.x ┳ feature/rails_6-x_update_xxx
┣ feature/rails_6-x_update_rails
┗ feature/rails_6-x_fix_xxx
Rails以外のGemのアップデート
影響の小さそうなものから順番に行っていく。
bundle outdated
を使うと必要なGemを炙り出せる。最近は結構見やすい形で出してくれるらしい。
Rails以外をbundle update --conservative <gem名>
でバージョンアップ--conservative
オプションにより、指定したgemと指定したgemが直接依存しているgemのみバージョンアップするようになる。
deviseは影響が大きそうなので、CHANGE LOGを確認するなどして慎重に行うこと。
あとは、bundle updateでまとめてやる。もう一回bundle outdatedで確認.
Railsのパッチバージョンを最新にする
いきなり6.xxから7に上げるのではなく、パッチバージョンを最新に上げる。テストを実行してきちんと動くことを確認。
Railsのメジャーバージョンを上げる
GemfileのRailsのバージョンを指定し、bundle update
を実行。
rails app:updateを実行
バージョンアップにあたり、必要なファイル作成やファイル更新を対話的に行える。
検討事項
先にRubyのバージョンをアップデートするか
今回はRubyはすでに3系を利用している。Rails7にすることができるバージョンなので、このタイミングでは必要ないかも。ただし、Railsのバージョンが上げ終わったらすぐにRubyのバージョンも上げておきたい。こまめにアップデートすることが無用なトラブル回避に繋がる。
importmapsを使うか
結論、使わないでよさそう。その場合は一旦bin/dev
の実行で凌ぐが、Procfile周りの取り扱いについて調べる必要がある。
デプロイはどうなるか
現状、PaaSに直接プッシュしてデプロイしている状態。Rails7に上げることで、そのプロセスに何か変化があるか。
必要そうな対応
アップデート前
オートローダー設定
以下を参考にオートローダーを変更しておく
https://railsguides.jp/classic_to_zeitwerk_howto.html
アップデート後
Sprokets
Sproketsを使っているので、Gemsprokets-rails
をGemffileに追記する必要がある。
外部ページへのリダイレクトの挙動
外部ページへのリダイレクトが最初から無効になっている。
以下のように書くことでリダイレクトを一時的に有効にできる。
redirect_to authorize_uri, allow_other_host: true unless sign_in?
参考にする記事