我希望在对象投票后使用ActiveModel callback来调用,问题是我正在使用的宝石(voteable_mongo)使模型可以投票{{3}在我的应用程序中,我该如何为它创建一个回调?
set_callback(:vote, :before) do |object|
object.do_something
end
显然我做的投票操作,但我使用的宝石有doesnt provide like a vote model or callback,你如何正确地扩展此方法以触发回调?
答案 0 :(得分:1)
将插件示例作为源代码,您可以执行以下操作:
class Post
include Mongoid::Document
include Mongo::Voteable
extend ActiveModel::Callbacks
define_model_callbacks :vote
# set points for each vote
voteable self, :up => +1, :down => -1
def vote(options, value = nil)
_run_vote_callbacks do
super( options, value )
end
end
end
我没有运行此代码,因此我不确定这是否能正常工作,但在最坏的情况下,您可以使用 alias_method_chain 对投票方法进行别名,或者只是复制并粘贴源于 _run_vote_callbacks 块内部(真的,非常难看,但无论如何它都是一个解决方案。)
修改强>
如果上面的代码不起作用,也可以使用alias_method_chain来完成:
class Post
include Mongoid::Document
include Mongo::Voteable
extend ActiveModel::Callbacks
define_model_callbacks :vote
# set points for each vote
voteable self, :up => +1, :down => -1
alias_method_chain :vote, :callback
def vote_with_callback(options, value = nil)
_run_vote_callbacks do
vote_without_callbacks( options, value )
end
end
end