Есть ли способ создать after_confirmation :do_something
?
Цель состоит в том, чтобы отправить электронное письмо после того, как пользователь подтвердит использование Devise :confirmable
.
Есть ли способ создать after_confirmation :do_something
?
Цель состоит в том, чтобы отправить электронное письмо после того, как пользователь подтвердит использование Devise :confirmable
.
Хмм, я не вижу обратного вызова для этого, но вы должны иметь возможность использовать обратный вызов before_save для пользователя (дополнительный кредит для использования наблюдателя) и проверить, было ли подтверждено confirm_at при разработке. Вы можете сделать что-то вроде:
send_the_email if self.confirmed_at_changed?
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html для получения более подробной информации о проверке изменения в поле.
Я использую 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
Вы можете переопределить метод 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 Resource, например:
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
Я тоже не вижу этот обратный вызов, возможно, вы можете попробовать переопределить метод подтверждения и вызвать свой обратный вызов там.
def send_confirmation_instructions(attributes={})
super(attributes)
your_method_here
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. Я пробовал этот путь, и он отлично работал.
Мы объединяем ответы от @Bernát и @RyanJM:
def confirm!
super
if confirmed_at_changed? and confirmed_at_was.nil?
do_stuff
end
end
Это кажется немного более эффективным и безопасным, чем два ответа отдельно.