Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails Devise: after_confirmation

Is there a way to create a after_confirmation :do_something ?

The goal is to send an e-mail after the user confirms using Devise :confirmable.

like image 319
donald Avatar asked Dec 29 '10 22:12

donald


4 Answers

I'm using Devise 3.1.2, it has a placeholder method after_confirmation which is called after the confirmation finished successfully. We just need to override this method in User model.

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

See: Devise 3.5.9 Source Code: https://github.com/plataformatec/devise/blob/d293e00ef5f431129108c1cbebe942b32e6ba616/lib/devise/models/confirmable.rb

like image 138
Blue Smith Avatar answered Nov 10 '22 02:11

Blue Smith


For new versions of devise 3.x :

See a different answer http://stackoverflow.com/a/20630036/2832282

For old versions of devise 2.x :

(Original answer)

but you should be able to put a before_save callback on the user (extra credit for using an observer) and check if confirmed_at was just set by devise. You can do something like:

  send_the_email if self.confirmed_at_changed?

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html for more details on checking the change on the field.

like image 36
njorden Avatar answered Nov 10 '22 03:11

njorden


You can override the confirm! method:

def confirm!
  super
  do_something
end

Discussion about the topic is at https://github.com/plataformatec/devise/issues/812. They say that there are no callbacks like after_confirmation :do_something because that approach would require a lot of different callbacks.

like image 11
Bernát Avatar answered Nov 10 '22 04:11

Bernát


Rails 4:

combining multiple answers above

  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
like image 6
noli Avatar answered Nov 10 '22 02:11

noli