2010-09-29 11 views
8

Ho notato che Rails non attiva il callback after_initialize quando il simbolo di callback viene passato come input.ActiveRecord: non chiama after_initialize quando il nome del metodo viene passato come simbolo

Il codice seguente non funziona.

class User < ActiveRecord::Base 
    after_initialize :init_data 

    def init_data 
    puts "In init_data" 
    end 

end 

Il codice sotto funziona.

class User < ActiveRecord::Base 

    def after_initialize 
    init_data 
    end 

    def init_data 
    puts "In init_data" 
    end 
end 

Qualcuno può spiegare questo comportamento?

Nota 1

L'ActiveRecord documentation dice quanto segue riguardo after_initialize:

Unlike all the other callbacks, after_find and after_initialize will 
only be run if an explicit implementation is defined (def after_find). 
In that case, all of the callback types will be called. 

Anche se si afferma che after_initialize richiede esplicita implementazione, trovo la seconda frase nel paragrafo precedente ambiguo, vale a dire In that case, all of the callback types will be called. Che cos'è all of the call back types?

L'esempio di codice nella documentazione ha un esempio che non fa uso esplicito implementazione:

after_initialize EncryptionWrapper.new 

risposta

7

Secondo il documentation, non è possibile utilizzare la macro metodi di classe in stile per le chiamate after_initialize o after_find:

I callback after_initialize e after_find sono leggermente diversi dagli altri . Non hanno equivalenti * e l'unico modo per registrarli è definendoli come metodi regolari . Se provi a registrati after_initialize o after_find usando i metodi di classe macro , saranno semplicemente ignorati. Questo comportamento è dovuto a prestazioni ragioni, dal momento che after_initialize e after_find saranno entrambi chiamati per ogni record trovato nel database, rallentare significativamente i query.

In breve, è necessario definire un metodo di after_initialize esempio:

class User < ActiveRecord::Base 

    def after_initialize 
    do_stuff 
    end 

end 
0

Sono abbastanza sicuro che i metodi invocati dal simbolo devono essere protetti o private.

Edit: Sì, ecco il Rails 3 documentation:

Il metodo di callback di riferimento lavorano specificando un metodo protetto o privato disponibile nell'oggetto

+0

Ho provato a fare il mio metodo di callback privato, e ho ancora avuto lo stesso comportamento. –

Problemi correlati