Skip to content

Upgrade Ruby on Rails: 6.2 -> 7.0 #1631

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
Nov 11, 2024
Merged

Upgrade Ruby on Rails: 6.2 -> 7.0 #1631

merged 20 commits into from
Nov 11, 2024

Conversation

nanophate
Copy link
Member

@nanophate nanophate commented Sep 18, 2024

やりたいこと

Rails 7.0 にアップグレードしたい


やったこと

  • Gemfile の gem 'rails', '~> 7.0' を指定
  • bundle update を実行
  • app:update を実行し該当のファイルを確認しながら、コミット
  • rambulance の autoload のタイミングを変更して、テストが行えるようにした (詳細: Upgrade Ruby on Rails: 6.2 -> 7.0 #1631 (comment))

確認方法

@nanophate nanophate temporarily deployed to coderdojo-pi-update-rai-5uhhfr September 18, 2024 15:10 Inactive
@yasulab yasulab temporarily deployed to coderdojo-pi-update-rai-yyysoh September 18, 2024 15:43 Inactive
Base automatically changed from update-3.1.6 to main September 21, 2024 01:59
@nanophate nanophate temporarily deployed to coderdojo-pi-update-rai-8coyxu October 20, 2024 02:35 Inactive
@yasulab yasulab temporarily deployed to coderdojo-pi-update-rai-hrbl8a October 20, 2024 03:14 Inactive
@nanophate nanophate temporarily deployed to coderdojo-pi-update-rai-t8ipzj October 20, 2024 03:31 Inactive
@nanophate
Copy link
Member Author

nanophate commented Oct 20, 2024

Rails 6からRails 7.0へのアップデートを完了し、通常のページは問題なく動作・表示されることを確認しました。しかし、ページが見つからない場合に例外をキャッチしてカスタムエラーページを表示する機能(Rambulance Gem)が正常に動作せず、テスト時にエラーが発生しています。

Screenshot 2024-10-20 at 19 36 28

https://github.com/coderdojo-japan/coderdojo.jp/actions/runs/11422953916/job/31781556938#step:6:319

NameError: uninitialized constant ApplicationHelper 発生原因の推測

調査を進めたところ、7556876 で追加した require 'rambulance/exceptions_app' で回避できてたと思ったエラーに関連がありました。開発環境では、require をするだけでエラーは出なくなりますが、実際に動作すると、rambulance が読み込まれてなく、エラーページを出す機能が機能していない事が確認、この NameError の解決が必要と考えます。

  • エラー: NameError: uninitialized constant ApplicationHelper
  • 推測: Rails 6 から Rails 7 へのアップグレードに伴い、オートローディングが Zeitwerk にされた影響か、オートローディングのタイミングが Rails 6 から大きく変更した影響。これにより、Gem の Railtie がアプリケーションのヘルパーモジュール(ApplicationHelperContractsHelper など)を参照する際に、それらがまだロードされておらずエラーが発生。

試してみた

  1. Rails 6 で動作確認
    • git checkout main でブランチを変更し
    • 結果: エラーは起きない
  2. Rambulance の issue に上がっていた回避方法 require 'rambulance/exceptions_app
    • 7556876 で追加
    • 結果: エラーは起きないが、Rambulance が機能していない、また RAILS_ENV=production bin/rails zeitwerk:check を行うと同様のエラーが表示される
  3. prepend_helpers_path の設定調整
    • Rambulance の Railtie 内の after: prepend_helpers_pathload_application_configapplication.initialize などに変更してロード後にならないか試みた。
    • 結果: この読み込み設定が期待通りに機能せず、引き続き NameError が発生。
  4. application.rb に ApplicationHelper の手動読み込みを追加
    • 変更点:
      # config/application.rb
      require_relative "boot"
      require "rails/all"
      
      Bundler.require(*Rails.groups)
      
      # 問題の回避策としてヘルパーファイルを手動で読み込む
      require_relative "../app/helpers/application_helper"
      
      module CoderdojoJp
        class Application < Rails::Application
        
    • 結果:
      • エラー(ApplicationHelper 関連)は解消されたが、新たに ContactsHelperNameError が発生。
       ❯ RAILS_ENV=production bin/rails zeitwerk:check
       ActionMailer::MailDeliveryJob
       ActionText::ContentHelper
       ActionText::TagHelper
       Rambulance::ExceptionsAppHelper
       Rambulance
       Rambulance
       ApplicationHelper
       rails aborted!
       NameError: uninitialized constant ContractsHelper
             Object.const_get(camel_cased_word)
                   ^^^^^^^^^^
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.8.4/lib/active_support/inflector/methods.rb:279:in `constantize'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.8.4/lib/active_support/core_ext/string/inflections.rb:74:in `constantize'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/actionpack-7.0.8.4/lib/abstract_controller/helpers.rb:181:in `block in modules_for_helpers'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/actionpack-7.0.8.4/lib/abstract_controller/helpers.rb:174:in `map!'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/actionpack-7.0.8.4/lib/abstract_controller/helpers.rb:174:in `modules_for_helpers'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/actionpack-7.0.8.4/lib/action_controller/metal/helpers.rb:104:in `modules_for_helpers'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/actionpack-7.0.8.4/lib/abstract_controller/helpers.rb:152:in `helper'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/actionpack-7.0.8.4/lib/action_controller/railties/helpers.rb:19:in `inherited'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/rambulance-3.3.0/lib/rambulance/exceptions_app.rb:22:in `<module:Rambulance>'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/rambulance-3.3.0/lib/rambulance/exceptions_app.rb:3:in `<main>'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/zeitwerk-2.6.18/lib/zeitwerk/kernel.rb:34:in `require'
       /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/rambulance-3.3.0/lib/rambulance/railtie.rb:5:in `block (2 levels) in <class:Railtie>'
      

@nanophate
Copy link
Member Author

nanophate commented Oct 21, 2024

IDEA 💡 rails/rails#43205 のコメントにあるように setup_main_autoloader で改善することもあるぽいので試してみる。読んでる感じ Autoloader の変更で起きた問題ですでに修正されてるようですが….

@nanophate nanophate marked this pull request as ready for review October 21, 2024 11:47
@nanophate
Copy link
Member Author

setup_main_autoloader に変更することで、動作も含めてエラーにならないことを確認しました 🎉 💯

Patch: yasslab/rambulance@f422d93
Patch Gem の利用: 45d49d9

@nanophate nanophate temporarily deployed to coderdojo-pi-update-rai-1uyjnn October 21, 2024 11:52 Inactive
@nalabjp
Copy link
Member

nalabjp commented Oct 29, 2024

rambulance関連は一通りリンク先やコードを追ってみましたが、現時点では原因がよくわからないです。
forked gemで期待通りの挙動になっているのであれば、一旦そのまま進めてしまうのが良さそうに思います。
一点だけ気になったのは 4a7f426 で有効になる変更点については特に触れられてなさそうですが、
内容の精査は不要という感じでしょうか?

Copy link
Member

@nalabjp nalabjp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#1631 (comment)
にレスがなかったのでv7.0でデフォルト設定となる項目のすべてを調査しました。
config/initializers配下の2つのファイルが不要になっているので削除しておいてもらえれば、
あとは特に問題はなさそうでした。
ということで、ファイル削除の再レビューも不要かなと思うので先にApproveしておきます。
ご対応ありがとうございました!

@nalabjp
Copy link
Member

nalabjp commented Nov 10, 2024

あ、Gemfile.lockがコンフリクトしてますね😅
それも合わせて修正しておいていただけると 🙏

@nanophate
Copy link
Member Author

#1631 (comment)
にレスがなかったのでv7.0でデフォルト設定となる項目のすべてを調査しました。
config/initializers配下の2つのファイルが不要になっているので削除しておいてもらえれば、
あとは特に問題はなさそうでした。

細かくレビューいただきありがとうございます!コメントに気付いていませんでした... 💦 申し訳ありません... 🙇
返信が数日ない時は気軽に @nanophate でメンションいただければ Slack でも通知が飛んで気づけると思います!

また、丁寧に一個一個調査していただきありがとうございます ☺️✨一つずつ対応していきます!!

@nanophate
Copy link
Member Author

Resolve ありがとうございます!マージしたいと思います...!!

@nanophate nanophate merged commit b0ad364 into main Nov 11, 2024
2 checks passed
@nanophate nanophate deleted the update-rails-7.0 branch November 11, 2024 00:53
@nanophate
Copy link
Member Author

もし何か起きた場合は、Rollback

heroku rollback v3292 -a coderdojo-japan
=== coderdojo-japan Releases - Current: v3292

 v3292 Deploy ae32e2c7 2024/11/08 15:00:29 +0900 
 v3291 Deploy a8805809 2024/11/08 14:57:45 +0900 

@yasulab
Copy link
Member

yasulab commented Nov 13, 2024

諸々の対応ありがとうございました...!!! (>人< )✨

@yasulab yasulab changed the title Update rails 7.0 Update Ruby on Rails: 6.2 -> 7.0 May 23, 2025
@yasulab yasulab changed the title Update Ruby on Rails: 6.2 -> 7.0 Upgrade Ruby on Rails: 6.2 -> 7.0 May 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants