2011-01-31 3 views
33

Je voudrais exécuter du code chaque fois qu'un e-mail est envoyé sur mon application.Comment créer un observateur Mailer

Comme ActionMailer ne supporte pas after_filter, j'aimerais utiliser un observateur.

Les docs de Rails le mentionnent en passant, mais n'élaborent pas.

Merci!

Répondre

71

Je suis étonné de voir à quel point la documentation de Rails à ce sujet est très limitée. Fondamentalement, ActionMailer dans Rails 3 introduit l'utilisation d'Intercepteurs (appelés avant l'envoi du message) et d'Observateurs (après l'envoi du message).

Pour mettre en place un observateur, ajouter ce qui suit à un initialiseur:

class MailObserver 
    def self.delivered_email(message) 
    # Do whatever you want with the message in here 
    end 
end 

ActionMailer::Base.register_observer(MailObserver) 

Maintenant, la méthode delivered_email se déroulera chaque fois que votre application envoie un e-mail. Cependant, vous n'aurez accès qu'au message Mail.

pour enregistrer un intercepteur à la place, faire la même chose que ci-dessus, en remplaçant register_observer avec register_interceptor, et renommer le procédé self.delivered_email-self.delivering_email.

This Railscast était la meilleure source que je pouvais trouver pour info sur ce sujet (ils ne parlent que d'intercepteurs, mais le concept est le même pour les observateurs).

+1

Merci dmarkow, c'est exactement ce que je cherchais, et comme vous l'avez dit, l'information est rare, surtout lorsque vous ne connaissez pas le terme "Interceptors". – thomasfedb

+14

Cela soulève d'autres questions - (1) Comment diriez-vous quel mailer et quelle méthode a été utilisée, (2) Comment observeriez-vous l'échec et (3) Comment testeriez-vous cela, y compris le cas d'échec? – user1158559

+1

Je peux confirmer cela fonctionne également dans Rails 4 –

Questions connexes