Получение ActiveModel :: Callbacks для работы с ActiveResource - PullRequest
7 голосов
/ 14 февраля 2012

Я пытаюсь заставить ActiveModel :: Callbacks работать с ActiveResource (особенно after_initialize) для приложения на Rails 3, но я не могу заставить его работать.Я не получаю никаких ошибок, но метод обратного вызова никогда не выполняется.

Вот фрагмент кода

class User < ActiveResource::Base
  extend ActiveModel::Callbacks
  define_model_callbacks :initialize, :only => :after

  after_initialize :update_info

  def update_info
    puts 'info'
  end 
end

По какой-то причине update_info никогда не выполняется.У кого-нибудь есть идеи, как заставить это работать?

1 Ответ

7 голосов
/ 14 февраля 2012

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

def initialize(attributes = {}, persisted = false)
  run_callbacks :initialize do
    super(attributes, persisted)
  end
end

Это кажется мне невероятно нелогичным, так как ожидает, что вы отследите сигнатуру существующего метода, перезапишите его и добавите функцию обратного вызова. Я надеюсь, что я что-то здесь упускаю и просто делаю ошибку, но у меня нет другого решения для работы.

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

module ActiveResource
  class Base    
    extend ActiveModel::Callbacks
    define_model_callbacks :initialize, :only => :after

    def initialize_with_callback(attributes = {}, persisted = false)
      run_callbacks :initialize do
        initialize_without_callback(attributes, persisted)
      end
    end
    alias_method_chain :initialize, :callback
  end
end
...