2010-09-29 4 views
8

J'ai remarqué que Rails ne déclenche pas de rappel lorsque le symbole de rappel est passé en entrée.ActiveRecord: Ne pas appeler after_initialize lorsque le nom de la méthode est passé en tant que symbole

Le code ci-dessous ne fonctionne pas.

class User < ActiveRecord::Base 
    after_initialize :init_data 

    def init_data 
    puts "In init_data" 
    end 

end 

Le code ci-dessous fonctionne.

class User < ActiveRecord::Base 

    def after_initialize 
    init_data 
    end 

    def init_data 
    puts "In init_data" 
    end 
end 

Quelqu'un peut-il expliquer ce comportement?

Note 1

ActiveRecord documentation dit le texte suivant à propos 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. 

Bien qu'il soit indiqué que after_initialize exige la mise en œuvre explicite, je trouve la deuxième phrase dans le paragraphe ci-dessus ambiguë, à savoir In that case, all of the callback types will be called. Qu'est-ce que all of the call back types?

L'exemple de code dans la documentation a un exemple qui n'utilise pas la mise en œuvre explicite:

after_initialize EncryptionWrapper.new 

Répondre

7

Selon le documentation, vous ne pouvez pas utiliser la macro méthodes de classe -style pour les after_initialize ou after_find callbacks:

Les rappels after_initialize et after_find sont un peu différents des autres . Ils n'ont pas de contreparties before_ * , et le seul moyen de les enregistrer est de les définir comme suit: méthodes régulières. Si vous essayez d'enregistrer after_initialize ou after_find à l'aide des méthodes de classe macro , elles seront simplement ignorées. Ce comportement est dû à la performance raisons, depuis after_initialize et after_find seront tous deux appelés pour chaque enregistrement trouvé dans la base de données, un important ralentissement des requêtes.

En bref, vous devez définir une méthode d'instance after_initialize:

class User < ActiveRecord::Base 

    def after_initialize 
    do_stuff 
    end 

end 
0

Je suis assez sûr que les méthodes invoquées par le symbole doivent être protégés ou privés.

Edit: Oui, voici le Rails 3 documentation:

La callbacks de référence méthode de travail en spécifiant une méthode protégée ou privée disponible dans l'objet

+0

J'ai essayé de faire ma méthode de rappel privé, et j'ai toujours eu le même comportement. –

Questions connexes