我的Rails应用程序中有以下模型:
class Comment
class Digest
end
end
当我尝试在控制台中加载它时,我得到:
$ rails c
Loading development environment (Rails 4.1.2)
irb(main):001:0> Comment::Digest
(irb):1: warning: toplevel constant Digest referenced by Comment::Digest
=> Digest
irb(main):002:0> require "comment/digest"
=> true
irb(main):003:0> Comment::Digest
=> Comment::Digest
如果我将Digest
的名称更改为Other
,则可以正常使用。该课程用于摘要通知,如果我可以相对容易地解决它,我想保留名称。
class Comment
class Other
end
end
irb(main):003:0> Comment::Other
=> Comment::Other
如果我添加初始化程序来加载模型,它可以正常工作:
# config/initializers/comment_digest_loader.rb
require "comment"
require "comment/digest"
我意识到没有使用const_get
b / c加载Digest模块已经存在。只是不确定处理这个的最佳方法。
答案 0 :(得分:3)
当您尝试引用顶级中存在但在引用常量中不存在的常量中的常量时,会出现错误:
Comment::String
# warning: toplevel constant String referenced by Comment::String
确保在尝试引用之前声明<{1>}类
。更新
似乎Rail的自动加载功能依赖于Comment::Digest
被调用,因为常量const_missing
已存在于顶层,Digest
显然未被调用,并且错误被抛出而不是正在加载的课程。
要验证这一点,请尝试运行代码,而不要求const_misssing
常量。
要缓解这种情况,您可以尝试急切加载模型:
digest
答案 1 :(得分:0)
您应该拥有正确的文件夹结构,以便ruby自动加载您的课程。在您的情况下,应在文件夹Comment::Digest
内定义comment
类。
如果您没有正确的文件夹结构,则必须在使用之前明确要求您的课程。
require "comment/digest"
Comment::Digest
它给你警告,因为,ruby没有自动加载类Comment::Digest
。但它知道顶级ruby模块Digest