Vote
gem ( https://github.com/peteonrails/vote_fu ) がアプリケーションに提供する ActiveRecord モデル ( ) を拡張しようとしています。(つまり、 にはありませvote.rb
んapp/models
)
私の最初のアプローチは、コードを含むというファイルを作成することでしたlib/extend_vote.rb
:
Vote.class_eval do
after_create :create_activity_stream_event
has_one :activity_stream_event
def create_activity_stream_event
# something..
end
end
これは最初の投票が作成されたときに機能しますが、後続の各投票を作成しようとするとエラーが発生しますTypeError (can't dup NilClass)
。
Vote
このエラーは、リクエストごとにクラスが自動的にリロードされるという事実によって引き起こされると思いますが、コードlib/extend_vote.rb
はサーバーの起動時に一度だけロードされ、これによりhas_one :activity_stream_event
関連付けが奇妙に動作します。(また、設定すると問題はなくなりconfig.cache_classes = true
ますdevelopment.rb
)
この問題を解決するために、to_prepare
ブロックを my に追加して、リクエストごとに投票拡張機能をリロードさせようとしましたdevelopment.rb
:
config.to_prepare do
load 'extend_vote.rb'
end
これで(can't dup NilClass)
問題は解決しますが、新しい投票を作成するたびに、create_activity_stream_event
コールバックが追加で呼び出されます。つまり、最初の投票では 1 回呼び出し、2 回目の投票では 2 回呼び出し、などです。つまり、to_prepare
ブロックがあまりにも積極的に拡張機能をリロードし、重複したコールバックを追加しているようです。
Vote
このモデルにメソッドとコールバックを追加する最良の方法は何ですか?