在实施“副作用”元编程时加载类的麻烦
我正在使用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
采取行动。