首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告:引用toplevel常量

警告:引用toplevel常量
EN

Stack Overflow用户
提问于 2013-08-29 15:29:24
回答 7查看 23.1K关注 0票数 42

我有四种型号(DocumentQuestionQuestion::DocumentAnswer)。在我的Answer模型中

代码语言:javascript
复制
validates :text,
  presence: { :unless => Proc.new{ |a| a.question.is_a? Question::Document } }

这给了我警告

warning: toplevel constant Document referenced by Question::Document

如何防止此警告发生(而不重命名类)?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-11 09:29:26

您的文件夹/文件结构应该如下所示:

代码语言:javascript
复制
app/
  models/
    question/
      document.rb
    answer.rb
    document.rb
    question.rb

然后rails将自动找到正确的模型(它将模型名称转换为文件名,名称空间被转换为文件夹)。

确保在您的question/document.rb中类定义看起来像以下选项之一:

代码语言:javascript
复制
class Question::Document
end

代码语言:javascript
复制
class Question
  class Document
  end
end

如果只编写class Document,则需要重新定义toplevel常量Document

注意,如果首先定义了全局Document,这也会触发此错误。这取决于代码路径,因此解决这个问题的最佳方法是在需要时添加一个require_dependency。有关更多背景信息,请参见这里这里

例如,类似于

代码语言:javascript
复制
require_dependency 'question/document' 

class Answer < ActiveRecord::Base

end  

如果将文件放置在不同的位置,rails无法自动找到它,则必须显式地要求它,这样rails就知道Question::Document的存在。

例如,如果在Question::Document模型中定义Question,这是一个合理的位置,则必须在Answer模型中显式地声明对Question模型的依赖。

因此,在这种情况下,在您的answer.rb中,您将编写

代码语言:javascript
复制
require_dependency 'question'

class Answer < ActiveRecord::Base
  # ..
end

虽然普通的require可以工作,但它更倾向于使用require_dependency,因为它将用于自动加载,这意味着:在开发过程中的行为符合预期。

票数 42
EN

Stack Overflow用户

发布于 2015-11-21 19:08:53

在Rails中,您不应该使用"require“,因为它会破坏自动加载。

其中一种解决方案是在定义外部常量的文件末尾追加一个require_dependency

app/models/question.rb

代码语言:javascript
复制
class Question
  # ...
end

require_dependency 'question/document'

app/models/question/document.rb

代码语言:javascript
复制
class Question
  class Document
    # ...
  end
end

这将强制在找到Question::Document常量之后加载Question类。通常,如果Rails已经知道顶级Document常量,那么如果不知道它就不会尝试加载Question::Document

参考资料:

  • Rails中的这个例子关于自动加载和重新加载常数的指南
  • 依赖性 at ApiDock
票数 21
EN

Stack Overflow用户

发布于 2013-09-06 20:17:13

您需要在引用冒犯的Question::Document引用之前定义Document。否则,Ruby将开始遍历名称空间以找到Document。你的answer.rb应该

代码语言:javascript
复制
require 'question/document'

在此基础上,假设这是定义Question::Document的路径。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18515100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档