Precena Tech Book
コーポレートサイト採用サイト
  • はじめに
  • ソフトウェア開発
    • 開発環境構築
      • Homebrew
        • Homebrew用語の意味
      • ngrok
        • ngrokの導入
        • ngrokのアップグレード(v2 to v3)
      • Slack
        • Slackの/remind コマンドの形式
        • 対面での相談を気軽にするためのSlack設定
      • AWS CLI
      • Ruby
      • Scala
      • Prettier
      • zsh
        • zsh-completion
      • Mac
        • M1 Macでの開発環境構築(rosetta 無し)
    • バックエンド
      • OpenAPI
        • OpenAPI 定義ファイル分割のすゝめ
      • Ruby on Rails
        • ActiveRecordのfind_or_initialize_byメソッドにブロックを渡したときの挙動
        • Railsのアプリケーションサーバーのプロセス数とスレッド数の設定方法
        • Railsを6.1系から7.0系へアップグレードした時に調査したこと
        • schema.rbで差分が発生する事例とその復旧について
        • tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
        • Rails Migrationチートシート
        • GithubのプライベートリポジトリをGemfileで参照する方法
        • ActiveSupportのto_jsonメソッドの注意点
        • 危険なJSON出力を禁止するRuboCopカスタムルールの作成方法
      • Scala
        • Validated を直列に処理したい
      • DB
        • PostgreSQLにおける、削除行に対するロック獲得時の挙動
    • フロントエンド
      • React
        • Storybookを利用したビジュアルリグレッションテスト
  • インフラ開発
    • AWS
      • IAM
        • スイッチロールの設定手順
        • AWS CLIでのスイッチロールの設定手順
        • AWS Vaultを使ったスイッチロール設定手順
        • Github ActionsでIAMロールを利用してAWSリソースを操作する
      • ECS
      • SES
        • AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する
      • CloudWatch
        • Amazon SNS + Slack Workflowを使って、CloudWatch Alarmの通知をSlackチャンネルへ投稿する
      • Lambda
        • lambrollでAWS Lambda関数をデプロイしたときのTips
    • Heroku
      • HerokuのStackの設定
      • Heroku Postgresの運用でよく使うコマンド集
  • セキュリティ
    • Web
      • Same Origin PolicyとCORS
      • 脆弱性診断 2社同時依頼実施記録
  • Mail
    • SPF、DKIM、DMARCを使用した迷惑メール対策
  • データ分析
    • データ分析プロセス
  • SaaS
    • Zendesk
      • 問い合わせフォームの項目をサービスごとに出し分け、各サービス担当者に自動で振り分けてメールで通知する
  • イベント
    • RubyKaigi
      • RubyKaigi 2023 に現地参加しました
    • EMConf
      • EMConfJP2025_参加レポート
  • やってみた
    • IoT
      • Raspberry Pi + PaSoRi + Python で、勤怠打刻マシンを作ってみた
  • Precena Tech Book 管理
    • コンテンツ執筆時のルール
  • 関連リンク
    • プレセナエンジニア公式Twitter
GitBook提供
このページ内
  • リリースノートやRailsガイドのアップグレードガイドを読む
  • 各gemがRails7.0対応しているか確認する
  • 各gemをバージョンアップする
  • 各種設定ファイルを更新する
  • app/models/application_record.rb
  • config/environments/development.rb
  • config/environments/production.rb
  • config/environments/test.rb
  • デフォルト値の影響調査
  • config.active_support.disable_to_s_conversion: true
  • action_dispatch.return_only_request_media_type_on_content_type: false
  • active_storage.multiple_file_field_include_hidden: true
  • おわりに

役に立ちましたか?

PDFとしてエクスポート
  1. ソフトウェア開発
  2. バックエンド
  3. Ruby on Rails

Railsを6.1系から7.0系へアップグレードした時に調査したこと

前へRailsのアプリケーションサーバーのプロセス数とスレッド数の設定方法次へschema.rbで差分が発生する事例とその復旧について

最終更新 2 年前

役に立ちましたか?

先日、Rails6.1系で動いていたシステムをRails7.0系にアップグレードしました。

そのシステムは

  • Rails製APIアプリケーション

  • コード量・利用者ともに小規模

  • テストコードが充実している

と比較的アップグレードしやすかったこともあり、無事に完了しました。

この記事ではアップグレードの際に調べたことをまとめておきます。

なお、作業はピクシブ株式会社さんのを参考にしながら進めました。ありがとうございました。

リリースノートやRailsガイドのアップグレードガイドを読む

Rails6.1から7.0へアップグレードを計画した段階で、Rails7.0系のリリースノートを読みました。

また、Railsガイドのアップグレードガイドの ました。

資料を読み終えたところで、対象のシステムは問題なさそうと判断し、準備を進めることにしました。

各gemがRails7.0対応しているか確認する

Rails7.0がリリースされた直後は、使っているgemがRails7.0対応していないものがありました。

そこで、定期的に各gemのリポジトリを見に行き、Rails7.0対応に関するissueやPull Requestを確認しました。

その後、使用しているすべてのgemがRails7.0対応がなされているのが確認できたため、具体的な作業に入りました。

各gemをバージョンアップする

今回は小規模だったこともあり、

  • bundle outdated でバージョンアップできるgemを確認

  • Rails以外を bundle update --conservative <gem名> でバージョンアップ

  • Railsを bundle update --conservative rails でバージョンアップ

の順で作業をしました。

また、各gemをバージョンアップするごとに、テストを流してパスすることを確認した上でGitブランチにコミットしました。

各種設定ファイルを更新する

まず、削除された設定について見てみましたが、主に

  • Rails7で config/initializers/ 以下が整理されたが、対象システムでは使っていない設定だった

ため、システムから削除しても問題なさそうでした。

次に、設定ファイルの変更で気になった点(後述)については調査を行いました。その結果、変更による影響がなさそうだったため、Rails7.0系での変更を各種設定ファイルに取り入れました。

ここでは、今回気になった点とその対応について以下にまとめます。

app/models/application_record.rb

class ApplicationRecord< ActiveRecord::Base
-  self.abstract_class = true
+  primary_abstract_class
end

config/environments/development.rb

+ config.server_timing = true

- config.assets.debug = true

- config.file_watcher = ActiveSupport::EventedFileUpdateChecker

一方、

  • config.assets.debug は使っていないシステムだった

  • config.file_watcher はDockerを使っていると影響ありそうな情報が散見されるものの、今回の環境では不要そうだった

ため、これらは設定ファイルから削除することにしました。

config/environments/production.rb

-  # Send deprecation notices to registered listeners.
-  config.active_support.deprecation = :notify
-
-  # Log disallowed deprecations.
-  config.active_support.disallowed_deprecation = :log
-
-  # Tell Active Support which deprecation messages to disallow.
-  config.active_support.disallowed_deprecation_warnings = []
+  # Don't log any deprecations.
+  config.active_support.report_deprecations = false

他の項目については、対象のシステムで無効にしていた設定だったため、対応は不要でした。

config/environments/test.rb

-  # Do not eager load code on boot. This avoids loading your whole application
-  # just for the purpose of running a single test. If you are using a tool that
-  # preloads Rails for running tests, you may have to set it to true.
-  config.eager_load = false
+  # Eager loading loads your whole application. When running a single test locally,
+  # this probably isn't necessary. It's a good idea to do in a continuous integration
+  # system, or in some way before deploying your code.
+  config.eager_load = ENV["CI"].present?

そのため、 config.eager_load は従来のまま false と明示的に設定しました。

デフォルト値の影響調査

そこで、Railsのデフォルト値の変更を調べることにしました。

上記の記事にある項目を確認しましたが、今回のシステムに対して影響するものはありませんでした。

次に、さきほどのQiitaの記事で触れられていなかったものについて調査しました。それらを以下にまとめます。

config.active_support.disable_to_s_conversion: true

ある種のRubyコアクラスに含まれる#to_sメソッドの上書きを無効にします。この設定は、アプリケーションでRuby 3.1の最適化をいち早く利用したい場合に使えます。

とあります。

今回は小規模なシステムだったこともあり影響がなかったため、デフォルト値の変更を受け入れました。

action_dispatch.return_only_request_media_type_on_content_type: false

active_storage.multiple_file_field_include_hidden: true

In Rails 7.1 and beyond, Active Storage has_many_attached relationships will default to replacing the current collection instead of appending to it.

とのことですが、今回のシステムには影響しなかったため、デフォルト値の変更を受け入れました。

おわりに

Rails7.0系にアップグレード後も開発・運用を継続していますが、今のところ大きな問題は発生していません。

今後もRailsのバージョンアップを継続して行うとともに、作業で気になったこと等はTechBookに記載していこうと思います。

--conservative オプションにより、指定したgemと指定したgemが直接依存しているgemのみバージョンアップするようになります ()

次に、を見て各種設定ファイルの差分を確認しました。

ため、Springに関する設定だった

なお、調査をする際はさんの記事が参考になりました。ありがとうございました。

を引用します。

を読むと primary_abstract_class の方が良さそうでしたので、差し替えました。

のうち、気になった点は以下でした。

を読むと、server timing ミドルウェアは便利そうでしたので追加することにしました。

のうち、気になった点は以下でした。

config.active_support.report_deprecations = false については、 によると一括でdeprecation warningを消せるオプションでした。 ただ、できる限りdeprecation warningは表示したいため、 true にしておきました。

のうち、気になった点は以下でした。

この変更を提供したところ、 では CI = true が設定されていたことから config.eager_loadが true になってしまい、CI/CDまわりで不具合が出ました。

RailsDiffで差分が出たデフォルト値に、 config/application.rb の中のconfig.load_defaults があり、値が 7.0 に変わっていました ()。

まず、7.0 とした場合の影響については を参照しながら調査しました。

調査する中で、 に変更内容がまとまっていたため、参考にいたしました。ありがとうございます。

には

に詳細な記載がありました。

を読み、今回のシステムには影響しなかったため、デフォルト値の変更を受け入れました。

に詳細がありました。

本サイトの更新情報は、Twitterので発信しています。ご確認ください。

永久保存版Railsアップデートガイド
Railsの公式Blog
Rails 6.1からRails 7.0へのアップグレード
Bundlerの公式ドキュメント
6.1系と7.0系間のRailsDiff
Rails7から、Springがデフォルトに含まれなくなった
TechRacho
RailsDiffでの差分
TechRachoさんの記事
RailsDiffでの差分
TechRachoさんの記事
RailsDiffの差分
TechRachoさんの記事
RailsDiffの差分
Github Actionsのデフォルトの環境変数
該当箇所
Railsガイドの load_defaults の結果
rails7へのバージョンアップを安全に行うために使用するnew_framework_defaults_7_0.rbの各項目をさらっと解説 - Qiita
Railsガイド
edgeのRailsガイド
TechRachoさんの記事
edgeのRailsガイド
株式会社プレセナ・ストラテジック・パートナーズエンジニア公式