首页 > 解决方案 > Rails & Devise - 如何确定用户何时注销?

问题描述

在我的 Rails 应用程序中,我有一些after_commit...on: :update回调,负责在用户更新他们的帐户设置后做一些工作。

问题是当用户注销时会触发这些回调。我通过调用来检查用户的更新内容self.previous_changes,这是输出:

=> {"remember_created_at"=>[Wed, 06 May 2020 20:32:09 UTC +00:00, nil], "updated_at"=>[Thu, 07 May 2020 14:52:42 UTC +00:00, Thu, 07 May 2020 14:54:40 UTC +00:00]}

所以你可以看到注销清除"remember_created_at"和更新"updated_at"

我可以在用户上创建一个方法,调用is_logging_out?它检查这两个更改的属性并返回 true,但这感觉很糟糕,我想知道是否有更优雅的方法来做到这一点。

(以防万一我正在设计 v3.5.10)

标签: ruby-on-railsrubyauthenticationdevise

解决方案


模型回调有这个缺点。我强烈建议不要使用模型回调来支持装饰器或显式调用。但是,如果您确定需要此回调,那么为什么不尝试跳过回调,除非remember_created_at它不为零?

def your_callback_method
  return unless remember_created_at

  #do stuff
end

您可以在回调方法本身中跳过它,也可以添加if: -> { record.remember_created_at }after_commit声明中

请不要添加模型中调用的方法is_logging_out?,因为这不是模型的责任。该模型不应依赖于用户正在进行的操作。


推荐阅读