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

esc*_*nxr 2 ruby-on-rails ruby-on-rails-6

我目前正在将 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'
...
Run Code Online (Sandbox Code Playgroud)

如果我刷新,则会出现另一个错误:

Before process_action callback :authenticate_user has not been defined
Run Code Online (Sandbox Code Playgroud)

(该方法存在)

最后,如果我再次刷新:

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

Run Code Online (Sandbox Code Playgroud)

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

任何帮助将非常感激

红宝石 2.6.5 导轨 6.0.1

esc*_*nxr 6

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

\n\n
def load_defaults(target_version)\n  case target_version.to_s\n  when "5.0"\n    [\xe2\x80\xa6]\n  when "5.2"\n    load_defaults "5.1"\n    [\xe2\x80\xa6]\n  when "6.0"\n    load_defaults "5.2"\n\n    self.autoloader = :zeitwerk if RUBY_ENGINE == "ruby"\n\n    [\xe2\x80\xa6]\n  else\n    raise "Unknown version #{target_version.to_s.inspect}"\n  end\n\n  @loaded_config_version = target_version\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有一种选择自动加载器的方法:

\n\n
def autoloader=(autoloader)\n  case autoloader\n  when :classic\n    @autoloader = autoloader\n  when :zeitwerk\n    require "zeitwerk"\n    @autoloader = autoloader\n  else\n    raise ArgumentError, "config.autoloader may be :classic or :zeitwerk, got #{autoloader.inspect} instead"\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
config.load_defaults 6.0\nconfig.autoloader = :classic\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在一切正常

\n