LoadError无法自动加载常量

bop*_*ard 3 ruby-on-rails autoload

似乎自动加载器正在加载lib/tools/address而不是我的模型

地址抛出以下错误

LoadError:无法自动加载常量Address,预期/lib/tools/address.rb来定义它

有人能告诉我我做错了什么.我认为
Address会指向常量模型/ address.rb

Tools :: Address到lib/tools/address.rb

应用程序/模型/ address.rb

class Address
  blah
end
Run Code Online (Sandbox Code Playgroud)

LIB /工具/ address.rb

module Tools
  class Address
    blah blah
  end
end
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 7

根据我的经验,使用具有相同名称但具有不同名称空间的多个常量可能会很棘手.在您的情况下,您有两个Address常量,一个在顶层,另一个在Tools命名空间内.这可能会混淆Rails自动加载器.

一些可能的解决方

如果要使用顶级Address(即模型),请使用明确引用它::Address.

如果这不起作用,您还可以使用require_dependency给自动加载器一个你想要的提示.在给你LoadError的文件的顶部,把这行:

require_dependency("address")
Run Code Online (Sandbox Code Playgroud)

这是文档:

require_dependency

使用机制解释文件并将其定义的常量标记为自动加载.file_name可以是字符串或响应to_path.

在代码中使用此方法,该代码绝对需要在该点定义某个常量.一个典型的用例是使常量名称解析对于在不同命名空间中具有相同相对名称的常量具有确定性,否则其评估将依赖于加载顺序.