Contents
Ruby on Rails 6から7への移行手順とチェックリスト:失敗リスクを抑える実務ガイド
Ruby on Railsのバージョンアップは、技術チームにとって重要なタスクです。しかし、Rails 6から7への移行には非互換性のある変更点や依存関係の再調整が含まれており、手順を間違えると深刻な障害につながる可能性があります。本記事では、2026年6月時点の最新情報を基に、Rubyバージョンの事前アップグレードからテスト戦略の見直しまで、失敗リスクを最小限に抑えるチェックリストを作成します。
Rubyバージョンの事前アップグレード手順
Rails 7はRuby 3.2.x以上が必須であり、この前提条件を満たさないとActive RecordやAction Cableでの不具合が発生する可能性があります。Ruby 3.3系への移行推奨という記述は誤りで、現行サポートされているバージョン(2026年現在はRuby 3.2.x)を推奨します。
現在のRubyバージョン確認
プロジェクトルートで以下のように実行し、現在使用しているバージョンを把握します。
|
1 2 |
ruby -v |
Ruby 3.2.x未満の場合、GemfileやRakefileに明示的にバージョンが記載されている場合があります。事前にGemfile.lockの変更履歴を確認し、依存関係に影響を与えるリスクを把握しましょう。
3.2系への移行手順
Ruby 3.2.xへの移行には以下のステップが必要です。
- Rubyバージョン管理ツール(RVMやrbenv)で3.2.xをインストール
- 例:
rbenv install 3.2.0 -
プロジェクトに適用する
bash
rbenv local 3.2.0 -
GemfileとGemfile.lockの更新
bundle update --rubyを実行し、Rubyバージョンが反映されているか確認
注意: Rubyバージョンアップは、プロジェクト全体に影響を与える可能性があるため、本番環境ではテスト用ブランチで事前に検証することが推奨されます。
Gemfile更新時の注意点
Rubyバージョンを変更後、GemfileとGemfile.lockの互換性を確認します。特に以下のライブラリに影響が出るケースがあります。
| ライブラリ | Ruby 3.2系への対応状況 |
|---|---|
| jbuilder | 非推奨(Rails7ではJSON APIが強化)*1 |
| rack-mini-profiler | バージョン2.3以降が必要 |
| aws-sdk | 1.0系からバージョン指定を厳密化 |
重要:
bundle outdatedやDependabotで非対応Gemを特定し、代替ライブラリへの移行かバージョン制限の設定が必要です。
Gemfile依存関係の互換性チェック
Rails 7では多くのGemが更新されているため、互換性があるかを事前に確認する必要があります。これにより、後々の障害や手間を最小限に抑えることができます。
Bundlerでのバージョン検証
Bundlerで依存関係を一括チェックします。以下のコマンドで非対応Gemが一覧表示されます。
|
1 2 |
bundle outdated |
出力結果のStatus列にIncompatibleが記載されているGemは、Rails 7との互換性が確認されていないため、早急に対処が必要です。
非対応Gemの特定方法
以下の方法で非対応Gemを特定できます。
- 公式ドキュメントへの確認:各GemのGitHubリポジトリやRubyGemsページで「Rails 7対応」の記載があるか確認
- Communityからの情報利用:Stack OverflowやQiita等で実際の導入例を調査
事例:
simple_formではRails 7で動作するが、formtasticは2025年6月時点までにサポート終了しているため、代替ライブラリ検討が必要です。
解決策の選定基準
非対応Gemを特定したら、以下の3つの選択肢から対応方法を選定します。
- バージョン制限:
Gemfileに~> 3.0.xなど明示的にバージョンを指定 - 代替ライブラリの導入:非推奨なGemの代替手段を探す(例:
simple_formへの移行) - 自前実装:特定の機能が必要不可欠な場合、カスタム開発で代替
補足: 2026年現在でも多くのGemはRuby 3.2.xに対応しているため、公式ドキュメントをしっかり確認することがポイントです。
Active Recordの変更点対応
Rails7ではdefault_scopeの廃止やクエリメソッドの仕様変更が導入されています。これにより、既存コードで不具合が発生するリスクがあります。
default_scope廃止の影響
Rails 7からdefault_scopeは非推奨となり、代わりに以下のようにclass_methodsやscopeメソッドを活用する必要があります。
|
1 2 3 4 5 6 |
# 廃止前のコード(Rails6) default_scope where(status: 'active') # Rails7以降の対応例 scope :active, -> { where(status: 'active') } |
この変更により、User.allではデフォルトでstatus: 'active'が適用されず、意図しないクエリ結果が生じる可能性があります。
queryメソッドの更新
Rails7ではqueryメソッドの引数にincludesやeager_load等のオプションが変更されています。以下の例のように、明示的なロード処理を追加する必要がある場合があります。
|
1 2 3 4 5 6 |
# Rails6までの書き方 User.where(status: 'active').query(:includes => :posts) # Rails7以降の書き方 User.where(status: 'active').includes(:posts).to_sql |
注意:
to_sqlはデバッグ用に限定的に使用し、実際のクエリではincludesやeager_loadを明示的に指定してください。
データベースマイグレーションの検証
以下のような変更点に対応する必要があります。
- データ型の変更:
Integer→BigIntegerなど、列タイプを確認 - インデックスの再作成:
add_indexで既存インデックスが適切に設定されているか確認 - マイグレーションスクリプトの実行: テスト環境での検証必須
補足: マイグレーションを適用する際は、データベースダミーを作成し、ロールバック機能も併せてテストすることが推奨されます。
Action Cableの設定見直し
Rails7ではAction Cableの仕様が若干変更され、特にJavaScriptとの連携やセキュリティ設定に注目が必要です。
チャンネル定義ファイルの更新
Rails7でapp/channels/**/*.rbを読み込む際、チャンネルクラス内での初期化処理が変更されています。以下のコード例のように、connectメソッド内で認証ロジックを個別に設定する必要があります。
|
1 2 3 4 5 6 7 8 9 10 11 |
class ChatChannel < ApplicationCable::Channel def connect # 認証処理(例: current_userのチェック) return reject_unauthorized_connection unless user_signed_in? end def speak(data) # WebSocket通信処理 end end |
注意: Rails7では、チャンネルの
subscribeメソッドに渡すオプションが変更されているため、テスト環境で動作確認が必要です。
JavaScriptライブラリの互換性
Action CableはTurboやHotwireとの連携が強化されています。しかし、JavaScriptライブラリ(例: stimulusやturbo-rails)を最新版にアップグレードしないと、以下のような問題が発生する可能性があります。
- JSイベントハンドラの不一致:古いバージョンのコールバック関数が実行されない
- CSSクラスの変更: ローディング中に表示されるUIが正しく描画されない
対処法:
yarnでライブラリを更新し、rails webpacker:installやstimulus installを実行して互換性を確認してください。
WebSocket接続のセキュリティ強化
Rails7ではCSRFトークンの有効期限が短縮されたり、ストレージ管理が厳格化されているため、以下の対応が必要です。
config.action_cable.disable_request_forgery_protection = trueをコメントアウト- JavaScript側でセッションクッキーの設定を明示的に指定(例:
withCredentials: true)
補足: これらの変更は、Action Cableがセキュアに動作するための必須手順です。
テストカバレッジ率の事前確保手法
Rails7への移行では、テスト環境でのカバレッジ率を95%以上確保することが重要です。これにより、移行後の不具合が早期に検出可能になります。
システムテストとユニットテストの分離
以下の手順で、既存のテストケースを整理します。
- Unit Test(ユニットテスト): モデルやサービスクラスの単体テスト
- Integration Test(インテグレーションテスト): コントローラとビューの連携を検証
- System Test(システムテスト): 実際のブラウザでの動作確認
例:
rspecでテストを分離する場合、spec/models/*_spec.rbとspec/features/*_spec.rbに分けて記述します。
CI環境での自動実行設定
移行作業においては、CI(継続的インテグレーション)環境での自動テストを強制的に実施する必要があります。以下のような手順が推奨されます。
- GitHub ActionsやCircleCIに
rspecのタスクを追加 - カバレッジ報告ツール(例: simplecov)で未カバー領域を可視化
- コードリファクタリングとテストケースの追加
注意: 2026年現在では、
simplecovはRuby 3.2.xとの互換性が確認済みですが、バージョン指定に注意してください。
カバレッジ不足時の対処法
テストカバレッジ率が低い場合、以下のステップで改善します。
- 未カバー領域の特定:
simplecovやcoverage/配下のレポートを確認 - 補足テストケースの作成(特に変更予定のメソッド)
- テスト環境でのリファクタリング実施
事例: 仮想通貨管理機能にテストが不足している場合、
spec/models/transaction_spec.rbにcreate_transactionやupdate_balanceを追加します。
Rails7新機能活用時の注意点
Rails7ではTurboやHotwireといった新機能が導入されており、これらを上手く利用するにはいくつかの注意点があります。
Turboフレームの導入手順
TurboはSPA構築を容易にする技術ですが、以下の手順で導入する必要があります。
Gemfileに追加:gem 'turbo-rails',gem 'stimulus-rails'- Webpacker設定の確認:
yarn add @hotwired/turboや@hotwired/stimulusをインストール - HTMLタグに
data-turbo-frame="true"属性追加
補足: TurboはRails7でデフォルトで有効になっていないため、
config/initializers/turbo.rbの設定が必要です。
Hotwireのセキュリティ設定
Hotwire(Turbo + Stimulus)を導入する際には、CSRFトークンとストレージ管理が重要です。
csrf-tokenの挿入:<meta name="csrf-token" content="<%= csrf_token %>">をHTMLヘッダに追加- ストレージのセキュリティ設定:
config.action_cable.allowed_request_origins = ['http://localhost:3000']など、許可されるオリジンを明示
注意: HotwireはJavaScriptと密接に関わるため、ブラウザのコンソールから動作確認を行うのが効率的です。
ロードバランサーとの互換性
Rails7で導入される新機能(例: Turbo)はロードバランサーとの連携に注意が必要です。特に以下のような点を確認してください。
- セッション管理: セッションクッキーがロードバランサーで正しく処理されているか
- キャッシュの設定:
Turbo::Frameのキャッシュ有効期限や、cache-controlヘッダの設定
事例: ロードバランサーが
SameSite=Noneをサポートしない場合、CSRFトークンの送信に失敗する可能性があるため、サーバー側での設定変更が必要です。
まとめ
本記事では、Ruby on Rails6から7への移行における具体的な手順とチェックリストを作成しました。以下が重要なポイントです。
- Rubyバージョンの事前アップグレード: 非対応Gemや依存関係を確認
- Active Record変更点の対応:
default_scope廃止やクエリメソッドの更新が必要 - テストカバレッジ率の確保: CIでの自動実行とレポート生成を導入
- Rails7新機能(Turbo, Hotwire)の導入: セキュリティ設定やロードバランサーとの連携に注意
チェックリストを活用し、移行計画を事前に策定することで、失敗リスクを最小限に抑え、円滑なアップグレードが可能になります。
*1: 2026年現在の情報に基づき、jbuilderは非推奨ですが、代替となるJSON API機能が強化されているため、今後も利用可能な場合があります。