¿Cómo puedo enviar un correo electrónico de bienvenida a los usuarios recién registrados en Rails utilizando Devise?

Estoy utilizando Devise on Rails y me pregunto si hay un gancho o un filtro que pueda usar para agregar un poco de código al proceso de registro de usuarios de Devise y enviar un correo electrónico de bienvenida al usuario después de crear una cuenta. Sin Devise sería algo como esto …

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

La siguiente respuesta más popular asume que estás usando el módulo Devise’s: confirmable, que no estoy usando.

No me gustaron las otras soluciones porque tiene que usar devoluciones de llamada de modelo, que siempre enviarán correos electrónicos de bienvenida incluso cuando cree su cuenta en la consola o en una interfaz de administración. Mi aplicación implica la capacidad de importar en masa usuarios desde un archivo CSV. No quiero que mi aplicación envíe un correo electrónico sorpresa a los 3000 de ellos uno por uno, pero sí quiero que los usuarios que crean su propia cuenta reciban un correo electrónico de bienvenida. La solución:

1) Anular el controlador de registros de Devise:

 #registrations_controller.rb class RegistrationsController < Devise::RegistrationsController def create super UserMailer.welcome(resource).deliver unless resource.invalid? end end 

2) Dígale a Devise que usted haya anulado su controlador de Registros:

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

https://stackoverflow.com/a/6133991/109618 muestra una respuesta decente (no perfecta), pero al menos mejor que las que estoy viendo aquí. Anula la confirm! método:

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

Esto es mejor porque no utiliza devoluciones de llamada. Las devoluciones de llamada no son excelentes en la medida en que (1) hacen que los modelos sean difíciles de probar; (2) poner demasiada lógica en los modelos. El uso excesivo de ellos a menudo significa que tiene un comportamiento en un modelo que pertenece a otro lugar. Para obtener más información sobre esto, consulte: Ventajas y desventajas del uso de devoluciones de llamada para lógica de dominio en Rails .

El enfoque anterior se une a la confirm! Método, que es preferible a una callback para este ejemplo. Sin embargo, como una callback, la lógica aún está en el modelo. 🙁 Así que no encuentro el enfoque totalmente satisfactorio.

Resolví esto usando un método de callback. No es la solución más limpia, no es tan limpia como un observador, pero la tomaré. ¡Tengo suerte 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 

Yo recomendaría usar un ActiveRecord :: Observer . La idea con el 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 el observador. La documentación describe el proceso bastante bien.

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

Dado que hace un tiempo se agregó un yield a los métodos del controlador Devise, creo que esta es probablemente la mejor manera de hacerlo.

 class RegistrationsController < Devise::RegistrationsController def create super do |resource| Notifier.welcome_email(resource).deliver if resource.persisted? end end end