这个问题与Rails Devise: after_confirmation非常相似,只是我正在寻找更具体的重新启动钩子
我的使用案例:我需要在某些第三方服务上同步新的用户电子邮件(准确地说是对讲机)。
我有一个使用API的第一个实现,我在那里放置了我需要的逻辑(所有整理都在服务中)
但是,我经常使用控制台进行大量维护,最明显的事情是执行
user.email = 'newemail@example.com'
user.confirm # or skip_reconfirmation
user.save
使用这个,我不会自动激活我的重新同步逻辑。有没有办法强制重新启动回调?覆盖after_confirmation
似乎不起作用
答案 0 :(得分:0)
不是一个真正的答案,但与此同时,我使用以下内容对我的用户类进行了monkeypatched(其中xxx
表示在用户类上添加的一些自定义方法,以便将新电子邮件同步到第三方服务)
class User
include User::Console if defined?('Rails::Console')
end
module User::Console
extend ActiveSupport::Concern
included do
## Override Devise confirmable to add warnings
def confirmation_warning
puts "WARNING !!".red
puts "calling `#confirm` or `#skip_reconfirmation!` on the user does not sync to xxx !\n"\
'Please either use [Name of custom confirmation service], '\
'or use `user.sync_to_xxx` to propagate changes'.red
end
def confirm
confirmation_warning
super
end
def skip_reconfirmation!
confirmation_warning
super
end
end
end
答案 1 :(得分:0)
我有完全相同的用例,我需要在第三方服务上同步新的用户电子邮件。
我解决它的方法是在before_update
模型上使用email_changed?
的User
过滤器:
class User < ApplicationRecord
before_update :update_email_in_third_party_service
private
def update_email_in_third_party_service
return unless self.valid? && self.email_changed?
# We passed our check, update email in the third party service (preferably in a background job)
end
end