0

Ruby onRails3.2.9とRuby1.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(ありがとう、@ croy28)

正解:悪をしないでください。プラグインの動作をより予測可能/混乱を少なくします。に適用する場合Articleは、に作用する必要がArticleありCommentます。

于 2012-12-11T20:14:47.893 に答える