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.0
与 new_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
现在一切正常
我目前正在将 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.0
与 new_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
现在一切正常