0

在 rspec 中调试一个不相关的问题时,我遇到了持续加载的问题。设置如下:

# app/models/foo.rb

class Foo << ApplicationRecord
  include Foo::Searchable
end
# app/models/foo/searchable.rb

module Foo::Searchable
  extend ActiveSupport::Concern

  included do
    #yada yada
  end
end

我在调试时收到以下错误。NameError: uninitialized constant #<Class:0x00007fadd32ea580>::Searchable 将命名更改为Foos::Searchable使用相应的文件夹移动确实可以解决问题,但我想了解实际发生的情况。

导轨 6.0.3.1 红宝石 2.6.6

4

3 回答 3

1

由于滥用范围解析运算符,除了使用<<而不是<您已经成为真正常见问题的受害者::。声明嵌套类或模块时不应使用它,因为它会导致错误的模块嵌套,并会导致缺少常量错误,除非您嵌套的模块已经加载。

您应该始终明确声明嵌套模块/类

class Foo < ApplicationRecord
  module Searchable
    extend ActiveSupport::Concern
    included do
      #yada yada
    end
  end
end

这个问题在过渡到 Rails 6 后到处出现的原因是旧的经典自动加载器重载Module#const_missing并掩盖了这些错误,因为它会自动加载 Foo。

Zeitwork 取代了经典的自动加载器,而是使用Module#autoload它是 Ruby 的一个相对较新的补充,并且不那么 hacky。

于 2020-06-04T12:49:32.277 回答
1

事实证明,这是由于与 Byebug 不兼容造成的。Byebug 在调试会话中停止 Zeitwerk 用于自动加载的事件。此处描述了该问题。

<<是一个错字,不会导致该错误。

于 2020-06-08T19:29:28.437 回答
0

也许您应该将 << 替换为 <。你继承,而不是重定向

class Foo < ApplicationRecord
  include Foo::Searchable
end
于 2020-06-04T12:49:02.843 回答