2012-02-14 6 views
7

Sto cercando di ottenere ActiveModel :: Callbacks per funzionare con ActiveResource (in particolare after_initialize) per un'applicazione Rails 3, ma non riesco a farlo funzionare. Non ricevo errori, ma il metodo di callback non viene mai eseguito.Ottenere ActiveModel :: Callbacks per funzionare con ActiveResource

Ecco un frammento di codice

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

    after_initialize :update_info 

    def update_info 
    puts 'info' 
    end 
end 

Per qualche ragione, l'update_info viene mai eseguito. Qualcuno ha idea di come farlo funzionare?

risposta

7

Nel caso qualcuno sia interessato, rileggo la documentazione su questo, e quello che pensavo fosse una spiegazione di come il codice funzionasse sotto le copertine, si è rivelato essere un requisito che indicava che avevo bisogno di sovrascrivere il metodo stavo aggiungendo callback a:

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

Questo sembra incredibilmente intuitivo per me, in quanto si aspetta di rintracciare la firma del metodo esistente, sovrascrivere, e aggiungere la funzionalità di richiamata. Spero di perdere qualcosa qui e di fare semplicemente un errore, ma non ho ottenuto altre soluzioni per funzionare.

In ogni modo, ecco un cerotto scimmia per fornire questo callback per tutte le classi 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 
+1

Questo è piuttosto deludente, ma sembra hai ragione. https://github.com/rails/rails/blob/master/activemodel/lib/active_model/callbacks.rb – tybro0103