Подтвердить что ты не робот

Rails Devise: after_confirmation

Есть ли способ создать after_confirmation :do_something?

Цель состоит в том, чтобы отправить электронное письмо после того, как пользователь подтвердит использование Devise :confirmable.

4b9b3361

Ответ 1

Хмм, я не вижу обратного вызова для этого, но вы должны иметь возможность использовать обратный вызов before_save для пользователя (дополнительный кредит для использования наблюдателя) и проверить, было ли подтверждено confirm_at при разработке. Вы можете сделать что-то вроде:

  send_the_email if self.confirmed_at_changed?

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html для получения более подробной информации о проверке изменения в поле.

Ответ 2

Я использую Devise 3.1.2, у него есть метод-заполнитель after_confirmation, который вызывается после успешного завершения подтверждения. Нам просто нужно переопределить этот метод в модели 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

Ответ 3

Вы можете переопределить метод confirm!:

def confirm!
  super
  do_something
end

Обсуждение темы на https://github.com/plataformatec/devise/issues/812. Они говорят, что нет обратных вызовов, таких как after_confirmation :do_something, потому что для этого подхода потребуется много разных обратных вызовов.

Ответ 4

Рельсы 4:

объединение нескольких ответов выше

  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

Ответ 6

Я тоже не вижу этот обратный вызов, возможно, вы можете попробовать переопределить метод подтверждения и вызвать свой обратный вызов там.

def send_confirmation_instructions(attributes={})
  super(attributes)
  your_method_here
end

Ответ 7

Вы можете переопределить метод confirm! на вашей модели

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def confirm!
    super
    do_something
  end
end

Обсуждается тема https://github.com/plataformatec/devise/issues/812. Я пробовал этот путь, и он отлично работал.

Ответ 8

Мы объединяем ответы от @Bernát и @RyanJM:

def confirm!
  super
  if confirmed_at_changed? and confirmed_at_was.nil?
    do_stuff
  end
end

Это кажется немного более эффективным и безопасным, чем два ответа отдельно.