相关疑难解决方法(0)

Rails 6:Zeitwerk::NameError 不从模块加载类

我有一个看起来像这样的文件

#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)

ruby ruby-on-rails

15
推荐指数
2
解决办法
8231
查看次数

升级到 Rails 6 时,是否有一种编程方式来检测 Zeitwerk::NameError?

我目前正在将旧的 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 问题中,我可以找到以下建议:

我不是在寻找解决方法,所以我更正了引发异常的文件。

我想找到一种编程方式来检测所有不一致的路径/类名,而无需在生产模式下运行应用程序。

到目前为止,我想到了三个选项:

  1. 用于验证自动加载的 rake 任务(gem 不提供)。它存在吗?你有一个片段可以从开发环境中的 rails 控制台运行吗?
  2. rubocop 警察或其他静态代码分析器。有吗?
  3. 在测试环境中强制加载

在不需要多次迭代/部署的情况下验证我的代码的建议方法是什么?

非常感谢你提前

ruby ruby-on-rails ruby-on-rails-6 zeitwerk

2
推荐指数
1
解决办法
536
查看次数

标签 统计

ruby ×2

ruby-on-rails ×2

ruby-on-rails-6 ×1

zeitwerk ×1