Rails 更新到 6.0.1:更改 config.load_defaults 时出错

Rails update to 6.0.1: errors when the config.load_defaults is changed

我目前正在将 Rails 应用程序从 5.2.4 更新到 6.0.1。 我使用了 rails app:update 任务,修复了一些折旧,然后在 new_framework_defaults_6_0.rb 中一一取消注释更改。一切正常,所有测试都经过验证,所以我删除了 new_framework_defaults_6_0.rb 文件并更改配置以加载新的默认值,使用 config.load_defaults 6.0 和... badaboum.

我可以启动 rails 服务器,但 Puma 出现错误:

Puma caught this error: uninitialized constant Admin (call 'Admin.connection' to establish a connection)::Concerns
Did you mean?  Concurrent (NameError)
/Users/xx/xx/app/models/admin.rb:4:in `<class:Admin>'
/Users/xx/xx/app/models/admin.rb:3:in `<top (required)>'
/Users/xx/.rvm/gems/ruby-2.6.5@xx/gems/zeitwerk-2.2.2/lib/zeitwerk/kernel.rb:16:in `require'
/Users/xx/.rvm/gems/ruby-2.6.5@xx/gems/zeitwerk-2.2.2/lib/zeitwerk/kernel.rb:16:in `require'
...

如果我刷新,我还有另一个错误:

Before process_action callback :authenticate_user has not been defined

(方法存在)

最后,如果我再次刷新:

undefined method `signed_in?' for #<#<Class:0x00007fc47a7706f0>:0x00007fc47a783a70>

这些方法存在于我的代码中,而不是 Gem。 就像某些文件未加载一样。 我不知道是什么问题,config.load_defaults 6.0new_framework_defaults_6_0.rb 做同样的事情,所以为什么它适用于文件但不适用于 config.load_defaults 6.0

任何帮助将不胜感激

Ruby 2.6.5 Rails6.0.1

好吧,解决方案非常简单,我没有注意到自动加载器是一个新的...Rails 默认使用 zeitwerk 自动加载器 rails 6.0:

def load_defaults(target_version)
  case target_version.to_s
  when "5.0"
    […]
  when "5.2"
    load_defaults "5.1"
    […]
  when "6.0"
    load_defaults "5.2"

    self.autoloader = :zeitwerk if RUBY_ENGINE == "ruby"

    […]
  else
    raise "Unknown version #{target_version.to_s.inspect}"
  end

  @loaded_config_version = target_version
end

选择自动加载器有以下方法:

def autoloader=(autoloader)
  case autoloader
  when :classic
    @autoloader = autoloader
  when :zeitwerk
    require "zeitwerk"
    @autoloader = autoloader
  else
    raise ArgumentError, "config.autoloader may be :classic or :zeitwerk, got #{autoloader.inspect} instead"
  end
end

所以我只是将 application.rb 更改为使用经典的自动加载器:

config.load_defaults 6.0
config.autoloader = :classic

现在一切正常