Ruby顶级常量加载问题

时间:2014-07-02 13:32:19

标签: ruby-on-rails ruby ruby-on-rails-4

我的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模块已经存在。只是不确定处理这个的最佳方法。

2 个答案:

答案 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