ruby-on-rails - 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)
解决方案
模型回调有这个缺点。我强烈建议不要使用模型回调来支持装饰器或显式调用。但是,如果您确定需要此回调,那么为什么不尝试跳过回调,除非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?
,因为这不是模型的责任。该模型不应依赖于用户正在进行的操作。
推荐阅读
- java - android.overridePathCheck=true' 是实验性的,在 3.6 上不受支持我该怎么办?
- django - Django - 错误消息:IndentationError: unindent 不匹配任何外部缩进级别
- java - 如何创建 javafx 对话框来更新值?
- python - 奇怪的行为。创建新列时,在 Pandas 数据框中生成单个负值
- java - Java 二维数组:Java 中 A 和 B 字母的矩形
- typescript - 如何使用 TypeScript 展平一棵树
- python - geoview 没有显示任何输出
- outlook - 如何检测 Outlook Web 加载项中的当前帐户类型
- python - 使用 phantom rest api 在 splunk phantom 中创建容器
- swift - SwiftUI 如何使用“Delegate-EventHandler-EventArgs”方式将数据从子级传递给父级,就像在 C# 中所做的那样