2011-12-21 5 views
23

¿Existe alguna forma global de que pueda escribir un before_filter para mi correo de usuario, que comprueba si el usuario tiene correos electrónicos deshabilitados? En este momento, cada correo que tengo comprueba la configuración del usuario, esto es muy redundante. Me gustaría SECAR esto teniendo un before_filter que funcione para todos los anuncios publicitarios.¿Cómo agregar un before_filter en UserMailer que verifica si está bien enviar un correo a un usuario?

class UserMailer < ActionMailer::Base 

before_filter :check_if_we_can_mail_the_user 

.... 

private 

    def check_if_we_can_mail_the_user 
    if current_user.mail_me == true 
     #continue 
    else 
     Do something to stop the controller from continuing to mail out 
    end 
    end 
end 

Posible? ¿Alguien ha hecho algo como esto? Gracias

+0

no existe tal cosa, porque normalmente pondría este tipo de lógica en fe. el modelo de usuario. el otro problema es que en muchos casos envía correos asynchrounus y no tiene nada que ver con 'current_user' – phoet

Respuesta

0

Quizás vea https://github.com/kelyar/mailer_callbacks. Parece que hará lo que quieras.

+3

Para el lector moderno: Rails 4 ahora tiene devoluciones de llamada de correo: before_action, after_action, around_action http: // edgeguides. rubyonrails.org/action_mailer_basics.html#action-mailer-callbacks – olleolleolle

6

No he hecho esto, pero he hecho cosas similares con un interceptor de correo electrónico.

class MailInterceptor  
    def self.delivering_email(message) 
     if User.where(:email => message.to).first.mail_me != true 
      message.perform_deliveries = false 
     end 
    end 
end 

Usted no tendrá acceso current_user, por lo que encontrar al usuario por correo electrónico, que ya debería estar en el objeto de correo como el campo 'a'.

Hay una buena cubierta de Railscast que configura los interceptores de correo electrónico. http://railscasts.com/episodes/206-action-mailer-in-rails-3?view=asciicast

27

Rails 4 ya tiene callbacks before_filter y after_filter. Para los usuarios de Rails 3, es sorprendentemente simple agregarlos: solo incluye AbstractController :: Callbacks. Esto imita el change to Rails 4 que, aparte de comentarios y pruebas, solo incluye devoluciones de llamada.

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? 
     mail.perform_deliveries = false 
    end 
    true 
    end 

end 
+4

¿No debería ser "before_filter"? ¿Por qué "después"? – Kulgar

+1

no tenemos la variable '@ user' en el before_filter! y el correo aún no se entregó. – caesarsol

+0

@Kulgar los documentos realmente explican que puede usar ambos, pero si usa after_filter puede hacer una lógica que dependa de las variables de instancia establecidas en el método de envío por correo: "Podría usar una acción anterior para llenar el objeto de correo con valores predeterminados, opciones de método de entrega o insertar cabeceras y archivos adjuntos predeterminados. Puede usar una acción posterior para realizar una configuración similar a una acción anterior pero utilizando variables de instancia establecidas en su acción de correo. " (Fuente: http://edgeguides.rubyonrails.org/action_mailer_basics.html#action-mailer-callbacks) – sandre89

Cuestiones relacionadas