我正在尝试扩展Votegem ( https://github.com/peteonrails/vote_fu ) 为我的应用程序提供的 ActiveRecord 模型 ( )。(即,没有vote.rbin 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模型添加方法和回调的最佳方式是什么?