2010-12-29 12 views

Respuesta

24

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.

+23

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

+1

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 –

1

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 
11

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.

1

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.

0

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.

74

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 
+2

Esto es correcto y muy útil. ¡Gracias! –

+0

Sí. Esta es una opción mucho mejor y correcta. –

+0

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

4

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