【问题标题】:LoadError Unable to autoload constantLoadError 无法自动加载常量
【发布时间】:2016-09-29 18:26:38
【问题描述】:

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

地址抛出如下错误

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

谁能告诉我我做错了什么。我以为
地址将指向常量 models/address.rb

Tools::lib/tools/address.rb的地址

app/models/address.rb

class Address
  blah
end

lib/tools/address.rb

module Tools
  class Address
    blah blah
  end
end

【问题讨论】:

  • lib/tools/address.rb 中缺少结尾。这只是一个错字吗?
  • @jaydel 是的,只是一个错字

标签: ruby-on-rails autoload


【解决方案1】:

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

一些可能的解决方案:

当您想使用顶级Address(即您的模型)时,请使用::Address 明确引用它。

如果这不起作用,您还可以使用require_dependency 向自动加载器提示您想要什么。在给出 LoadError 的文件顶部,输入以下行:

require_dependency("address")

这是文档:

require_dependency

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

在绝对需要在此时定义某个常量的代码中使用此方法。一个典型的用例是为不同命名空间中具有相同相对名称的常量确定常量名称解析,否则它们的评估将取决于加载顺序。

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 2020-08-27
    • 1970-01-01
    • 2019-03-14
    • 2019-08-19
    • 2020-03-31
    • 2017-10-22
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多