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

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

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

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

 Article @comment.customize 

如果我理解“邪恶”部分,上面的代码是有效的,因为在运行customize方法之前Article类的“简单”调用使得它触发acts_as_customizable方法,该方法又将(通过元编程) customize方法添加到Comment类。

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

这是由懒惰/自动加载引起的。 为了节省时间轨,不会在启动时加载所有类。 相反,它会在必要时加载它们。 如果您从未访问过Article ,那么它就不会被加载,因此, Comment没有获得动态方法。

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

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

正确答案:不要做恶。 使插件行为更可预测/更少混淆。 如果它适用于Article ,它应该对Article而不是Comment采取行动。