Rails,创建一个回调

时间:2011-07-25 00:19:10

标签: ruby-on-rails-3 activemodel

我希望在对象投票后使用ActiveModel callback来调用,问题是我正在使用的宝石(voteable_mongo)使模型可以投票{{3}在我的应用程序中,我该如何为它创建一个回调?

set_callback(:vote, :before) do |object|
  object.do_something
end

显然我做的投票操作,但我使用的宝石有doesnt provide like a vote model or callback,你如何正确地扩展此方法以触发回调?

1 个答案:

答案 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