在实施“副作用”元编程时加载类的麻烦

时间:2012-12-11 19:58:58

标签: ruby-on-rails ruby ruby-on-rails-3 class metaprogramming

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

我实现了一个acts_as_customizable插件,我有一个Article模型类“充当可自定义的”。该插件通过元编程,将一个名为customize的方法添加到Comment模型类( note :因为这个,该插件有副作用,因为操纵Comment对象范围之外的Article对象。

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

Article
@comment.customize

如果我理解了“邪恶”部分,上面的代码就可以了,因为在运行Article方法之前对customize进行“简单”调用会使其成为触发acts_as_customizable方法,然后将customize方法添加(通过元编程)到Comment类。

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

1 个答案:

答案 0 :(得分:1)

这是由懒惰/自动加载引起的。为了节省时间轨,不会在启动时加载所有类。相反,它会在必要时加载它们。如果您从未访问Article,则表示未加载Comment,因此require_dependency未获取其动态方法。

  

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

简单回答:使用Article(谢谢,@ cryo28)

正确答案:不要做恶。使插件行为更可预测/更少混淆。如果它应用于Article,则应该Comment而不是{{1}}。