Rails Devise: after_confirmation - PullRequest
       25

Rails Devise: after_confirmation

33 голосов
/ 30 декабря 2010

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

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

Ответы [ 8 ]

83 голосов
/ 17 декабря 2013

Я использую 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.5.9 Исходный код: https://github.com/plataformatec/devise/blob/d293e00ef5f431129108c1cbebe942b32e6ba616/lib/devise/models/confirmable.rb

24 голосов
/ 30 декабря 2010

Для новых версий devise 3.x:

См. Другой ответ http://stackoverflow.com/a/20630036/2832282

Для старых версий devise 2.x:

(Оригинальный ответ)

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

  send_the_email if self.confirmed_at_changed?

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

10 голосов
/ 30 марта 2012

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

def confirm!
  super
  do_something
end

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

5 голосов
/ 09 января 2014

Рельсы 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
2 голосов
/ 10 мая 2016

в соответствии с исходным кодом Devise 3.5.9, вы можете просто определить метод в модели ресурсов Devise, например ::100100

  class User < ActiveRecord::Base
  ...
    def after_confirmation
       do_something
    end
  end

См .: Разработка 3.5.9 Исходный код: https://github.com/plataformatec/devise/blob/d293e00ef5f431129108c1cbebe942b32e6ba616/lib/devise/models/confirmable.rb

1 голос
/ 07 мая 2013

Вы можете переопределить метод 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. Я попробовал этот способ, и он отлично работал.

1 голос
/ 30 декабря 2010

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

def send_confirmation_instructions(attributes={})
  super(attributes)
  your_method_here
end
0 голосов
/ 05 декабря 2013

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

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

Кажется, что это немного лучше для понимания производительности и безопасности, чем два ответа по отдельности.

...