Rails, создание обратного вызова - PullRequest
2 голосов
/ 25 июля 2011

Я хочу использовать обратный вызов ActiveModel для вызова после того, как за объект проголосовали, проблема в том, что камень, который я использую ( voiceable_mongo ), чтобы сделать модельvotable не предоставляет в моем приложении подобие модели голосования или обратного вызова , так как я могу создать для него функцию обратного вызова?

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

Очевидно, что действие по голосованию я придумал, но жемчужина IЯ использую имеет этот метод , как бы вы должным образом расширить этот метод для запуска обратного вызова?

1 Ответ

1 голос
/ 25 июля 2011

Взяв пример плагина в качестве источника, вы можете сделать следующее:

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 (действительно, действительно ужасно, но в любом случае это решение).

EDIT

Это также можно сделать с помощью 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
...