设计再确认钩子

时间:2018-06-06 14:37:18

标签: ruby-on-rails devise ruby-on-rails-5 devise-confirmable

这个问题与Rails Devise: after_confirmation非常相似,只是我正在寻找更具体的重新启动钩子

我的使用案例:我需要在某些第三方服务上同步新的用户电子邮件(准确地说是对讲机)。

我有一个使用API​​的第一个实现,我在那里放置了我需要的逻辑(所有整理都在服务中)

但是,我经常使用控制台进行大量维护,最明显的事情是执行

user.email = 'newemail@example.com'
user.confirm # or skip_reconfirmation
user.save

使用这个,我不会自动激活我的重新同步逻辑。有没有办法强制重新启动回调?覆盖after_confirmation似乎不起作用

2 个答案:

答案 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