我有一个看起来像这样的文件
#app/services/account/authenticate/base.rb
module Account
module Authenticate
AuthenticateError = Class.new(StandardError)
class Base < ::Account::Base
def self.call(*attrs)
raise NotImplementedError
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在当我运行代码时rails c出现错误
> ::Account::Authenticate::AuthenticateError
=> NameError (uninitialized constant Account::Authenticate::AuthenticateError)
> ::Account::Authenticate.constants
=> [:Base, :ViaToken]
Run Code Online (Sandbox Code Playgroud)
所以 rails 没有看到 AuthenticateError 类。但是当我从这个文件夹创建一个嵌套类时
=> Account::Authenticate::ViaToken
> ::Account::Authenticate.constants
=> [:Base, :AuthenticateError, :ViaToken]
Run Code Online (Sandbox Code Playgroud)
AuthenticateError 类现在可见
> ::Account::Authenticate::AuthenticateError
=> Account::Authenticate::AuthenticateError
Run Code Online (Sandbox Code Playgroud)
这个问题的解决方案是创建一个单独的文件authenticate_error.rb,它从一开始就可以工作,但这个解决方案对我来说并不理想。是否有任何解决方案可以预加载所有类或 smth?
(Ruby 2.6 和 Rails 6.0.0.rc2)
我目前正在将旧的 Rails 应用程序迁移到 Rails 6。
好像项目中有些文件和里面定义的类不一致。运行应用程序测试时我没有看到此错误,但在部署后我收到如下错误:
Zeitwerk::NameError: expected file /app/my?_/app/lib/multi_io.rb to define constant MultiIo, but didn't
Run Code Online (Sandbox Code Playgroud)
在以前的 SO 问题中,我可以找到以下建议:
config.autoloader = :classicconfig.autoload_path我不是在寻找解决方法,所以我更正了引发异常的文件。
我想找到一种编程方式来检测所有不一致的路径/类名,而无需在生产模式下运行应用程序。
到目前为止,我想到了三个选项:
在不需要多次迭代/部署的情况下验证我的代码的建议方法是什么?
非常感谢你提前