2010-10-17 8 views
3

I mis en place un système d'authentification en utilisant authlogic et ont ajouté le mot de passe fonctionnalité de remise à zéro selon ce tutoriel http://github.com/rejeep/authlogic-password-reset-tutorialRails méthodes actionmailer confusion

Tout fonctionne, mais je comprends mal pourquoi il fait ..

Il est ce code ..

class User < ActiveRecord::Base 
    def deliver_password_reset_instructions! 
    reset_perishable_token! 
    Notifier.deliver_password_reset_instructions(self) 
    end 
end 

et ce

class Notifier < ActionMailer::Base 
    def password_reset_instructions(user) 
    subject  "Password Reset Instructions" 
    from   "[email protected]" 
    recipients user.email 
    content_type "text/html" 
    sent_on  Time.now 
    body   :edit_password_reset_url => edit_password_reset_url(user.perishable_token) 
    end 
end 

Cette ligne me confond

Notifier.deliver_password_reset_instructions(self) 

comme méthode dans la classe notificateur est appelée

password_reset_instructions 

sans le bit deliver_.

Alors, que se passe-t-il ici? comment ça se passe tout ça?

Répondre

3

Grande question, Beaucoup de gens oublient de poser ces questions. Avez-vous remarqué, que vous n'avez jamais vraiment instancier vos objets de classe mailer. Vos méthodes de classe de mailer sont habituellement enveloppées avec ceci

Ainsi intérieurement ceci emploie le concept de method_missing dans le rubis. Supposons que vous appeliez une certaine méthode dans un ruby ​​qui n'existe pas pour cet objet, ruby ​​appelle la méthode method_missing. Ce qui est défini dans le « ActionMailer :: Base » Code

 
def method_missing(method_symbol, *parameters)#:nodoc: 
    case method_symbol.id2name 
    when /^create_([_a-z]\w*)/ then new($1, *parameters).mail 
    when /^deliver_([_a-z]\w*)/ then new($1, *parameters).deliver! 
    when "new" then nil 
    else super 
    end 
end 

donc si une méthode correspond à « deliver_ » et toute combinaison de lettres minuscules, Rails instancie Mailer classe (en appelant le « nouveau ») et envoie avec les paramètres de l'initialiseur et appelle "livrer!" méthode pour enfin livrer le courrier.

va de même pour les méthodes de type « create_ <method_name> »

+0

Merci beaucoup pour votre explication détaillée, il est logique maintenant. – pingu

1

Ceci est la convention Rails 2 ActionMailer.

Pour envoyer un courrier électronique, utilisez YourMailerClass.deliver_NAME_OF_THE_METHOD. Pour initialiser un e-mail, utilisez YourMailerClass.create_NAME_OF_THE_METHOD.

Rails créera automatiquement une instance de la classe Mailer, appellera votre méthode et délivrera l'objet email.