¿Hay alguna manera de crear un after_confirmation :do_something
?Barandillas Diseñar: after_confirmation
El objetivo es enviar un correo electrónico después de que el usuario confirme usando Devise :confirmable
.
¿Hay alguna manera de crear un after_confirmation :do_something
?Barandillas Diseñar: after_confirmation
El objetivo es enviar un correo electrónico después de que el usuario confirme usando Devise :confirmable
.
Hmm, no veo una devolución de llamada para eso, pero debería poder poner una devolución de llamada before_save en el usuario (crédito adicional por usar un observador) y comprobar si confirm_at fue creado por el inventor. Usted puede hacer algo como:
send_the_email if self.confirmed_at_changed?
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html para más detalles sobre el control del cambio en el campo.
No veo esa devolución de llamada también, quizás pueda intentar anular el método de confirmación y llamar a su devolución de llamada allí.
def send_confirmation_instructions(attributes={})
super(attributes)
your_method_here
end
Puede reemplazar el método confirm!
:
def confirm!
super
do_something
end
Discusión sobre el tema está en https://github.com/plataformatec/devise/issues/812. Dicen que no hay callbacks como after_confirmation :do_something
porque ese enfoque requeriría muchas devoluciones de llamada diferentes.
Puede reemplazar el método confirm!
del modelo de
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
def confirm!
super
do_something
end
end
Hay una discusión sobre el tema se https://github.com/plataformatec/devise/issues/812. Lo intenté de esta manera, y funcionó muy bien.
Estamos combinando respuestas de @ Bernát y @RyanJM:
def confirm!
super
if confirmed_at_changed? and confirmed_at_was.nil?
do_stuff
end
end
esto parece un poco más de rendimiento consciente y seguro de las dos respuestas por separado.
Estoy usando Devise 3.1.2, tiene un método marcador de posición after_confirmation
que se invoca después de que la confirmación haya finalizado correctamente. Solo tenemos que anular este método en el modelo User
.
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
# Override Devise::Confirmable#after_confirmation
def after_confirmation
# Do something...
end
end
Esto es correcto y muy útil. ¡Gracias! –
Sí. Esta es una opción mucho mejor y correcta. –
por alguna razón estoy obteniendo 'método indefinido' after_confirmation 'for User' ...podría ser un problema de configuración de diseño? – s2t2
Carriles 4:
la combinación de múltiples respuestas anteriores
def first_confirmation?
previous_changes[:confirmed_at] && previous_changes[:confirmed_at].first.nil?
end
def confirm!
super
if first_confirmation?
# do first confirmation stuff
end
end
de acuerdo con el código fuente Devise 3.5.9, puede simplemente definir un método en el modelo de recursos Devise, por ejemplo:
class User < ActiveRecord::Base
...
def after_confirmation
do_something
end
end
See: Devise 3.5.9 Código Fuente: https://github.com/plataformatec/devise/blob/d293e00ef5f431129108c1cbebe942b32e6ba616/lib/devise/models/confirmable.rb
Si desea que se envíe solo la primera vez que confirman, lo siguiente debería funcionar bien. 'after_save: send_welcome_email,: if => proc {| l | l.confirmed_at_changed? && l.confirmed_at_was.nil? } ' – RyanJM
Para futuros lectores, [esta respuesta] (http://stackoverflow.com/a/20630036/2832282) destacó que ahora hay una devolución de llamada oficial' after_confirmation' que puede anularse en su modelo de usuario –