2010-11-10 8 views
23

Estoy usando Devise on Rails y me pregunto si hay un gancho o filtro que pueda usar para agregar un poco de código al proceso de registro de usuario de Devise y enviar un correo electrónico de bienvenida al usuario después de que se haya creado una cuenta . Sin Diseñar sería algo como esto ...¿Cómo puedo enviar un correo electrónico de bienvenida a los usuarios recién registrados en Rails utilizando Devise?

respond_to do |format| 
     if @user.save 
     Notifier.welcome_email(@user).deliver # <======= 
    ... 
+0

¿Está utilizando el método confirmable de Devise? – Shreyas

+0

Es curioso que lo preguntes porque tengo problemas con ese método. No envía el correo electrónico, aunque mi configuración funciona. No, para el correo electrónico de bienvenida, estoy usando mi propio método. – picardo

Respuesta

8

Lo resolví utilizando un método de devolución de llamada. No es la solución más limpia, no tan limpia como un observador, pero la tomaré. ¡Tengo suerte de que Mongoid implementó las devoluciones de llamada de ActiveRecord!

after_create :send_welcome_mail 
    def send_welcome_mail 
    Contact.welcome_email(self.email, self.name).deliver 
    end 
+0

¿Cómo puedo enviar el mensaje de bienvenida "después" de que haya confirmado la cuenta? (en restful_authentication había un método llamado recientemente_activated?) –

+0

Hay un método similar en Devise. http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Confirmable#confirmed%3F-instance_method – picardo

+2

picardo: en realidad solo verifica si está confirmado o no. ¡Tuve que sobrescribir la confirmación! método: https://github.com/plataformatec/devise/issues/812#comment_1113176 –

6

yo recomendaría usar un ActiveRecord::Observer. La idea del observador es que crearía una clase con un método after_save que llamaría a la notificación. Todo lo que necesita hacer es crear la clase de observador y luego modificar la configuración de la aplicación para registrar al observador. La documentación describe el proceso bastante bien.

El uso del patrón de observación significa que no necesita cambiar ninguna lógica en el controlador.

+0

Estoy usando Mongoid. ¿Todavía es posible usar un observador ActiveRecord? – picardo

+0

Bueno, mirando http: //blog.eizesus.com/2010/03/creating-a-rails-authentication-system-on-mongoid-part-2-7-3-2010/no parece que haya soporte de observadores. Creo que su llamada a after_create me parece que es la mejor manera –

10

https://stackoverflow.com/a/6133991/109618 muestra una respuesta decente (no perfecto), pero por lo menos mejor que los que estoy viendo aquí. Se anula el método confirm!:

class User < ActiveRecord::Base 
    devise # ... 
    # ... 
    def confirm! 
    welcome_message # define this method as needed 
    super 
    end 
    # ... 
end 

Esto es mejor, ya que no utiliza devoluciones de llamada. Las rellamadas no son buenas en la medida en que (1) hacen que los modelos sean difíciles de probar; (2) poner demasiada lógica en los modelos. Sobreutilizarlos a menudo significa que tiene un comportamiento en un modelo que pertenece a otra parte. Para obtener más información sobre esto, consulte: Pros and cons of using callbacks for domain logic in Rails.

El enfoque anterior se relaciona con el método confirm!, que es preferible a una devolución de llamada para este ejemplo. Como una devolución de llamada, la lógica todavía está en el modelo. :(Así que no encuentro el enfoque plenamente satisfactoria

+0

No sé cómo puede ser mejor, porque el programa de correo es parte del controlador, no del modelo. Más simple, pero equivocado. –

33

La siguiente respuesta más popular asume que está utilizando el uso del Legado:.. Confirmable módulo, que no estoy

que no me gusta la otra soluciones porque tiene que usar devoluciones de llamada modelo, que siempre enviará correos electrónicos de bienvenida, incluso cuando se crea su cuenta en la consola o una interfaz de administrador. Mi aplicación implica la capacidad de importar en masa los usuarios de un archivo CSV. No quiero que mi aplicación enviando un correo electrónico sorpresa a todos los 3000 uno por uno, pero quiero que los usuarios que crean su propia cuenta reciban un correo electrónico de bienvenida. La solución:

1) Anular las inscripciones de Devise cont rodillo:

#registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 

    def create 
    super 
    UserMailer.welcome(resource).deliver unless resource.invalid? 
    end 

end 

2) Dile a diseñar hizo caso omiso de su controlador inscripciones:

# routes.rb 
devise_for :users, controllers: { registrations: "registrations" } 
+2

Me gusta este enfoque, es limpio, no requiere mucho código, y la lógica es obvia. Gracias por esta respuesta! – asfallows

+1

Esta parece ser la mejor solución. –

+0

¿Cómo sabes que '@ user' está disponible? –

2

Desde un yield se ha agregado a los métodos de controlador de idear un tiempo atrás, creo que esto es ahora probablemente la mejor manera para hacerlo.

class RegistrationsController < Devise::RegistrationsController 

    def create 
    super do |resource| 
     Notifier.welcome_email(resource).deliver if resource.persisted? 
    end 
    end 

end 
Cuestiones relacionadas