我正在尝试扩展Vote
gem ( https://github.com/peteonrails/vote_fu ) 为我的应用程序提供的 ActiveRecord 模型 ( )。(即,没有vote.rb
in 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
回调都会被调用一次。即,第一次投票调用它一次,第二次调用它两次,依此类推。所以看起来该to_prepare
块正在积极地重新加载扩展并添加重复的回调。
向此Vote
模型添加方法和回调的最佳方式是什么?