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
好吧,解决方案非常简单,我没有注意到自动加载器是一个新的...Railszeitwerk在 Rails 6.0 中默认使用自动加载器:
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\nRun Code Online (Sandbox Code Playgroud)\n\n还有一种选择自动加载器的方法:
\n\ndef 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\nRun Code Online (Sandbox Code Playgroud)\n\n所以我只是更改application.rb为使用经典的自动加载器:
config.load_defaults 6.0\nconfig.autoloader = :classic\nRun Code Online (Sandbox Code Playgroud)\n\n现在一切正常
\n| 归档时间: |
|
| 查看次数: |
3368 次 |
| 最近记录: |