diff --git a/lib/devise/models/confirmable.rb b/lib/devise/models/confirmable.rb index 0e5ce7a11e..5803d8d3ea 100644 --- a/lib/devise/models/confirmable.rb +++ b/lib/devise/models/confirmable.rb @@ -66,7 +66,7 @@ def confirm! self.confirmation_token = nil self.confirmed_at = Time.now.utc - if self.class.reconfirmable && unconfirmed_email.present? + saved = if self.class.reconfirmable && unconfirmed_email.present? skip_reconfirmation! self.email = unconfirmed_email self.unconfirmed_email = nil @@ -76,6 +76,9 @@ def confirm! else save(:validate => false) end + + after_confirmation if saved + saved end end @@ -264,6 +267,9 @@ def send_confirmation_notification? confirmation_required? && !@skip_confirmation_notification && !self.email.blank? end + def after_confirmation + end + module ClassMethods # Attempt to find a user by its email. If a record is found, send new # confirmation instructions to it. If not, try searching for a user by unconfirmed_email diff --git a/test/models/confirmable_test.rb b/test/models/confirmable_test.rb index e367f94174..b0a7fd4474 100644 --- a/test/models/confirmable_test.rb +++ b/test/models/confirmable_test.rb @@ -312,6 +312,27 @@ def confirm_user_by_token_with_confirmation_sent_at(confirmation_sent_at) user.ensure_confirmation_token! assert_equal user.confirmation_token, old end + + test 'should call after_confirmation if confirmed' do + user = create_user + user.define_singleton_method :after_confirmation do + self.username = self.username.to_s + 'updated' + end + old = user.username + assert user.confirm! + assert_not_equal user.username, old + end + + test 'should not call after_confirmation if not confirmed' do + user = create_user + assert user.confirm! + user.define_singleton_method :after_confirmation do + self.username = self.username.to_s + 'updated' + end + old = user.username + assert_not user.confirm! + assert_equal user.username, old + end end class ReconfirmableTest < ActiveSupport::TestCase