ruby-on-rails - signup - devise wiki
¿Cómo puedo enviar un correo electrónico de bienvenida a los usuarios recién registrados en Rails utilizando Devise? (5)
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
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" }
Resolví esto usando un método de devolución de llamada. 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.
https://.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 devolución de llamada para este ejemplo. Sin embargo, como una devolución de llamada, la lógica aún está en el modelo. :( Así que no encuentro el enfoque totalmente satisfactorio.