Retrasar o reenviar el correo electrónico de confirmación de Devise para usuarios creados manualmente

Estoy usando Devise para permitir que los usuarios se registren tan bien como usar mi propio administrador de usuarios para crear usuarios manualmente. Cuando creo un usuario en el administrador, Devise envía una confirmación inmediatamente al nuevo usuario. Creo que esto se debe al hecho de que tanto el dispositivo como mi administrador usan el mismo modelo. ¿Cómo demoro este correo electrónico hasta que el administrador esté listo para enviarlo?

Además, la validación de Devise requiere que el administrador establezca una contraseña para el nuevo usuario. Preferiría que los usuarios creados manualmente especifiquen su propia contraseña cuando respondan a la confirmación. En este momento, los usuarios creados manualmente no sabrán su contraseña a menos que yo también los envíe en un correo electrónico complementario.

Hacemos esto en una de nuestras aplicaciones. Puede decirle a Devise que NO envíe automáticamente la confirmación de esta manera:

@user.skip_confirmation! 

Y luego, más tarde, puedes hacer.

 Devise::Mailer.confirmation_instructions(@user).deliver 

Para Rails 2.x harías algo como:

 DeviseMailer.deliver_confirmation_instructions(@user) 

@ user.skip_confirmation! confirma al usuario, por lo que el usuario puede iniciar sesión sin utilizar la confirmación.

Esto me funciona en el dispositivo 3.5.

Deja de diseñar para enviar un correo electrónico de confirmación al crear el usuario

 @user.skip_confirmation_notification! 

Enviar instrucciones de confirmación más tarde.

 @user.send_confirmation_instructions 

La solución no es tan simple como la respuesta de @Ryan Heneise. Si lo haces @user.skip_confirmation! confirma al usuario, por lo que el usuario puede iniciar sesión sin utilizar la confirmación, por lo que la carta de confirmación en este caso es inútil. Esta solución no permite al usuario iniciar sesión sin la confirmación: Rails 3 with Devise for Authentication – ¿Cómo creo manualmente un usuario?

Ahora hay una forma más fácil (se agregó de nuevo en v2.2.4)

¡El módulo confirmable de Devise ahora incluye la perfecta notificación skip_confirmation_notification! Método que permite una solución más limpia:

 @user = User.new params[:user] @user.skip_confirmation_notification! @user.save # ... do stuff, then later... Devise::Mailer.confirmation_instructions(@user).deliver 

Acabo de pasar un tiempo investigando esto, básicamente solo necesitas agregar esto y configurar delayedjob .

 def send_confirmation_instructions generate_confirmation_token! if self.confirmation_token.nil? ::Devise.mailer.delay.confirmation_instructions(self) end 

Agréguelo a su modelo de usuario como método protegido para anular el de uno en confirmable . Además, tenga en cuenta que la gem se acaba de actualizar para agregar un nuevo método que se anulará en la creación que envía las instrucciones de confirmación .

¿Utiliza trabajo retrasado ? Le permite definir métodos individuales para la ejecución retrasada.