我有四种型号(Document、Question、Question::Document和Answer)。在我的Answer模型中
validates :text,
presence: { :unless => Proc.new{ |a| a.question.is_a? Question::Document } }这给了我警告
warning: toplevel constant Document referenced by Question::Document
如何防止此警告发生(而不重命名类)?
发布于 2013-09-11 09:29:26
您的文件夹/文件结构应该如下所示:
app/
models/
question/
document.rb
answer.rb
document.rb
question.rb然后rails将自动找到正确的模型(它将模型名称转换为文件名,名称空间被转换为文件夹)。
确保在您的question/document.rb中类定义看起来像以下选项之一:
class Question::Document
end或
class Question
class Document
end
end如果只编写class Document,则需要重新定义toplevel常量Document。
注意,如果首先定义了全局Document,这也会触发此错误。这取决于代码路径,因此解决这个问题的最佳方法是在需要时添加一个require_dependency。有关更多背景信息,请参见这里和这里。
例如,类似于
require_dependency 'question/document'
class Answer < ActiveRecord::Base
end 如果将文件放置在不同的位置,rails无法自动找到它,则必须显式地要求它,这样rails就知道Question::Document的存在。
例如,如果在Question::Document模型中定义Question,这是一个合理的位置,则必须在Answer模型中显式地声明对Question模型的依赖。
因此,在这种情况下,在您的answer.rb中,您将编写
require_dependency 'question'
class Answer < ActiveRecord::Base
# ..
end虽然普通的
require可以工作,但它更倾向于使用require_dependency,因为它将用于自动加载,这意味着:在开发过程中的行为符合预期。
发布于 2015-11-21 19:08:53
在Rails中,您不应该使用"require“,因为它会破坏自动加载。
其中一种解决方案是在定义外部常量的文件末尾追加一个require_dependency。
app/models/question.rb
class Question
# ...
end
require_dependency 'question/document'app/models/question/document.rb
class Question
class Document
# ...
end
end这将强制在找到Question::Document常量之后加载Question类。通常,如果Rails已经知道顶级Document常量,那么如果不知道它就不会尝试加载Question::Document。
参考资料:
发布于 2013-09-06 20:17:13
您需要在引用冒犯的Question::Document引用之前定义Document。否则,Ruby将开始遍历名称空间以找到Document。你的answer.rb应该
require 'question/document'在此基础上,假设这是定义Question::Document的路径。
https://stackoverflow.com/questions/18515100
复制相似问题