2012-02-14 34 views
7

Bir Rails 3 uygulaması için ActiveModel :: Callbacks ile ActiveResource (özellikle after_initialize) ile çalışacak şekilde çalışıyorum ama çalışmaya başlayamıyorum. Herhangi bir hata alamıyorum, ancak geri arama yöntemi hiçbir zaman yürütülmez. İşte ActiveModel'i Başlarken :: ActiveResource ile çalışmak için geri aramalar

Nedense kod

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

    after_initialize :update_info 

    def update_info 
    puts 'info' 
    end 
end 

snippet'idir, update_info asla çalıştırılmaz. Bunun işe nasıl başlayacağı konusunda bir fikri olan var mı?

cevap

7

Herhangi biri ilgilenirse, bu belgeyi yeniden okudum ve kodun kapakların altında nasıl çalıştığına dair bir açıklama olduğunu düşündüğüm, yöntemin geçersiz kılınması gerektiğini belirten bir gereklilik olduğu ortaya çıktı.

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

o mevcut yöntemin imzasını izini üzerine yazmak ve geri işlevsellik eklemenizi bekler gibi bu bana inanılmaz sezgilere görünüyor: Ben geri aramalar ekliyordu. Umarım burada bir şey eksik olurum ve bir hata yapardım, ama işe yaramayacak başka bir çözüm bulamadım.

Neyse, işte tüm AR sınıflarına bu geri arama sağlamak için bir maymun yama geçerli:

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 
+1

Bu oldukça hayal kırıklığı, ama haklısınız görünür. https://github.com/rails/rails/blob/master/activemodel/lib/active_model/callbacks.rb – tybro0103