2010-12-03 12 views
27

Estoy usando Devise para permitir el registro de usuario as-well-as usando mi propio administrador de usuario para crear usuarios manualmente. Cuando creo un usuario en el administrador, Devise envía una confirmación de inmediato al nuevo usuario. Creo que esto se debe al hecho de que tanto el dispositivo como mi administrador usan el mismo modelo. ¿Cómo retraso este correo electrónico hasta que el administrador esté listo para enviarlo?Retraso y/o reenvío Correo electrónico de confirmación de Devise para usuarios creados manualmente

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 responden 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.

Respuesta

37

Hacemos esto en una de nuestras aplicaciones. Se puede decir NO idear para proporcionar automáticamente la confirmación de la siguiente manera:

@user.skip_confirmation! 

Y más tarde, puede hacerlo

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

Para 2.x Rieles usted haría algo como:

DeviseMailer.deliver_confirmation_instructions(@user) 
+4

¡Debo mencionar también que debe establecer @ user.skip_confirmation! _antes de que guardes el registro. – mysmallidea

+1

como dombesz mencionó en su respuesta - @ user.skip_confirmation !, hace esto: self.confirmed_at = Time.now.utc, ¿así que luego tiene: user.active? == verdadero ... el usuario puede hacer everythig como si hubiera confirmado su correo electrónico ... – santuxus

+5

Estoy usando user.send_confirmation_instructions, ya que eso generará un token de confirmación si no existe –

-2

¿Usas delayed job? Le permite definir métodos únicos para la ejecución retrasada.

+0

retrasa quizá era una palabra mala elección. Quiero evitar que Devise envíe el correo electrónico, pero tengo una acción que envía ese correo electrónico de confirmación cuando el administrador finaliza la configuración del nuevo registro de usuario. –

11

La solución no es tan simple como la respuesta de @Ryan Heneise. Si lo hace @user.skip_confirmation!, confirma al usuario, por lo que el usuario puede iniciar sesión sin usar 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 - How do I manually create a user?

+0

Buen punto. En mi aplicación, este es el comportamiento deseado, pero es algo a tener en cuenta. – mysmallidea

1

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

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

agregarlo en su modelo de usuario como método protegido para anular el legado de confirmable. Además, tenga en cuenta que la gema se acaba de actualizar para agregar un nuevo método para ser overridden on create that sends the confirmation instructions.

9

Ahora hay (se añadió de nuevo en v2.2.4) una manera más fácil

módulo de confirmable Diseñar ahora incluye la skip_confirmation_notification perfecto! 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 
41

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

Esto funciona para mí en idear 3,5

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

@user.skip_confirmation_notification! 

instrucciones Enviar confirmación posterior

@user.send_confirmation_instructions 
+1

Esto merece ser la mejor respuesta. 'skip_confirmation!' confirma al usuario automáticamente, por lo que no tiene sentido para el caso de uso del OP. – nahtnam

Cuestiones relacionadas