2

オブジェクトが投票された後に呼び出されるようにActiveModel コールバックを使用したいのですが、問題は、モデルを投票可能にするために使用している宝石 ( voteable_mongo ) が、アプリで投票モデルやコールバックのように提供されないことです。コールバックを作成できますか?

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

明らかに私が作成した投票アクションですが、私が使用している宝石にはこのメソッドがあります。このメソッドをどのように適切に拡張してコールバックをトリガーしますか?

4

1 に答える 1

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
于 2011-07-25T01:48:32.430 に答える