Есть ли способ создать after_confirmation :do_something?
after_confirmation :do_something
Цель состоит в том, чтобы отправить электронное письмо после того, как пользователь подтвердит использование Devise :confirmable.
:confirmable
Я использую Devise 3.1.2, у него есть метод-заполнитель after_confirmation, который вызывается после успешного завершения подтверждения.Нам просто нужно переопределить этот метод в User модели.
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
Для новых версий 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 для более подробной информации о проверке изменений на поле.
Вы можете переопределить метод confirm!:
confirm!
def confirm! super do_something end
Обсуждение этой темы ведется по адресу https://github.com/plataformatec/devise/issues/812.. Они говорят, что не существует таких обратных вызовов, как after_confirmation :do_something, потому что для такого подхода потребуется много различных обратных вызовов.
Рельсы 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
в соответствии с исходным кодом Devise 3.5.9, вы можете просто определить метод в модели ресурсов Devise, например ::100100
class User < ActiveRecord::Base ... def after_confirmation do_something end end
Вы можете переопределить метод 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. Я попробовал этот способ, и он отлично работал.
Я тоже не вижу этого обратного вызова, возможно, вы можете попытаться переопределить метод подтверждения и вызвать обратный вызов там.
def send_confirmation_instructions(attributes={}) super(attributes) your_method_here end
Мы объединяем ответы от @ Bernát и @RyanJM:
def confirm! super if confirmed_at_changed? and confirmed_at_was.nil? do_stuff end end
Кажется, что это немного лучше для понимания производительности и безопасности, чем два ответа по отдельности.