0

我正在使用 Ruby on Rails 3.2.9 和 Ruby 1.9.3-p125。场景如下:

我实现了一个acts_as_customizable插件,并且我有一个Article“可定制”的模型类。该插件通过元编程向模型类添加了一个名为的方法(注意:从那以后,插件具有副作用,因为在对象范围之外操作对象)。customizeCommentCommentArticle

鉴于这种情况,当我(重新)启动服务器并运行时@comment.customize,我会收到错误消息NoMethodError - undefined method 'customize' for #<Comment:0x0...>。但是,当我(重新)启动服务器并运行以下代码时,一切都按预期工作:

Article
@comment.customize

如果我理解“邪恶”部分,上面的代码可以工作,因为在运行该方法之前Article对类的“简单”调用使其触发该方法,该方法又将(通过元编程)该方法添加到类中。customizeacts_as_customizablecustomizeComment

我应该如何避免“邪​​恶”?

4

1 回答 1

1

这是由延迟/自动加载引起的。为了节省时间,rails 不会在启动时加载所有类。相反,它会在必要时加载它们。如果您从不访问Article,则它不会被加载,因此Comment不会获得它的动态方法。

我应该如何避免“邪​​恶”?

简单的答案:使用require_dependency(谢谢,@cryo28)

正确答案:不作恶。使插件行为更可预测/更少混乱。如果它应用于Article,它应该作用于Article而不是Comment

于 2012-12-11T20:14:47.893 回答