2013-07-10 16 views
7

quello che mi serve:Prima di filtro in azione mailer Rails 3

Qualcosa di simile a before_filter in ActionMailer in Rails 3.

Problema:

sto lavorando Rails 3 e vuoi avere un before_filter in ActionMailer. Controllato il actionmailer api e imparato su callback before_action e after_action. Quando viene implementato dà l'errore:

NoMethodError: undefined method `before_action' for Notifier:Class 

poi appreso che non c'è prima di chiamare all'azione per Rails 3 da questa post

Isnt Esiste un gancio o gemma in modo che possiamo avere qualcosa di simile come before_filter in Rails 3.

Please help. Grazie molto!!

risposta

10

Può essere ottenuto includendo AbstractController :: Callbacks. Questo imita la modifica a Rails 4 che, oltre ai commenti e ai test, include solo le Callback.

class MyMailer < ActionMailer::Base 
    include AbstractController::Callbacks 

    after_filter :check_email 

    def some_mail_action(user) 
    @user = user 
    ... 
    end 

    private 
    def check_email 
    if @user.email.nil? 
    message.perform_deliveries = false 
    end 
    true 
    end 

end 

Riferimento - How to add a before_filter in UserMailer which checks if it is OK to mail a user?

+2

Attenzione, su rotaie 3 (verificato questo w/ActionMailer 3.2.21), chiamando "posta" nel tuo after_filter invoca ancora una volta ActionMailer :: Base # posta. "mail", come da 3.2.21, non è progettato per essere chiamato ripetutamente: alcune delle informazioni che hai passato per la prima volta saranno appiccicose (il corpo per esempio) mentre altre informazioni non lo sono (soggetto ad esempio). È più sicuro e più affidabile riferirsi a "messaggio" anziché a "posta". Nel caso precedente, "mail.perform_deliveries = false" porta a termine il lavoro (impedisce l'uscita della posta) ma ha anche effetti collaterali (reimposta l'oggetto al valore predefinito, ecc.). – Benissimo