2011-01-31 13 views
33

Vorrei eseguire un codice ogni volta che viene inviata un'e-mail sulla mia app.Come creare un Mailer Observer

Poiché ActionMailer non supporta after_filter, vorrei utilizzare un osservatore.

I documenti di Rails lo menzionano di sfuggita, tuttavia non elaborato.

Grazie!

risposta

71

Sono sorpreso di quanto poco ci sia nella documentazione di Rails su questo.

Fondamentalmente, ActionMailer in Rails 3 introduce l'uso di Interceptor (chiamati prima che il messaggio venga inviato) e Observers (dopo che il messaggio è stato inviato).

Per configurare un osservatore, aggiungere il seguente ad un inizializzatore:

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

ActionMailer::Base.register_observer(MailObserver) 

Ora, il metodo delivered_email verrà eseguito ogni volta che la vostra applicazione invia una e-mail. Tuttavia, avrai accesso solo al messaggio effettivo Mail.

per registrare un intercettore invece, fanno lo stesso come sopra, sostituendo register_observer con register_interceptor, e rinomina il metodo dal self.delivered_email a self.delivering_email.

This Railscast era la migliore fonte che potessi trovare per informazioni su questo (si parla solo di intercettori, ma il concetto è lo stesso per gli osservatori).

+1

Grazie dmarkow, questo è esattamente quello che stavo cercando, e come hai detto, le informazioni sono scarse, soprattutto quando non si conosce il termine "Intercettori" è uno da cercare. – thomasfedb

+14

Questo solleva qualche altra domanda: (1) Come diresti quale mailer e quale metodo è stato usato, (2) Come osserveresti il ​​fallimento e (3) Come testesti questo, incluso il caso di fallimento? – user1158559

+1

Posso confermare che funziona anche su Rails 4 –

Problemi correlati