获取ActiveModel :: Callbacks以使用ActiveResource

时间:2012-02-14 00:12:58

标签: ruby-on-rails-3 activeresource activemodel

我正在尝试让ActiveModel :: Callbacks与Rails 3应用程序的ActiveResource(特别是after_initialize)一起使用,但我似乎无法让它工作。我没有得到任何错误,但回调方法永远不会执行。

以下是一段代码

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

答案 0 :(得分:7)

如果有人感兴趣,我会重新阅读有关这方面的文档,我认为这是对代码如何在封面下工作的解释,结果证明我需要覆盖方法I正在添加回调:

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