【问题标题】:Getting ActiveModel::Callbacks to work with ActiveResource让 ActiveModel::Callbacks 与 ActiveResource 一起工作
【发布时间】:2012-02-14 00:12:58
【问题描述】:

我试图让 ActiveModel::Callbacks 与 Rails 3 应用程序的 ActiveResource(特别是 after_initialize)一起工作,但我似乎无法让它工作。我没有收到任何错误,但从未执行过回调方法。

这是一段sn-p代码

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 永远不会执行。有人知道如何让它工作吗?

【问题讨论】:

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


    【解决方案1】:

    如果有人感兴趣,我会重新阅读有关此的文档,我认为是对代码如何在幕后工作的解释,结果证明我需要重写我的方法正在添加回调:

    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
    

    【讨论】:

    猜你喜欢
    • 2016-12-13
    • 2016-10-06
    • 2011-11-30
    • 2014-02-19
    • 2011-09-03
    • 2013-05-01
    • 2018-05-30
    • 2014-03-17
    • 2011-09-29
    相关资源
    最近更新 更多