Rails & Devise - 如何确定用户何时注销?

Rails & Devise - how to determine when a user is logging out?

在我的 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? 的用户上创建一个方法来检查这两个更改的属性和 returns true,但这感觉很糟糕,我想知道是否有更优雅的方法去做这个。

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

您真的要首先使用模型回调吗?他们天生古怪,控制他们被解雇的时间和地点通常变得越来越困难。

如果您只是重写控制器,您就会确切地知道将在何处触发此逻辑,并且它不会减慢您的测试速度或产生更多意想不到的错误。

class UsersController < Devise::SessionsController
  def update
    super do |user|
      # do something awesome
    end
  end
end
devise_for :users, controller: {
  registrations: 'my_sessions'
}

模型回调有这个缺点。我强烈提倡不要使用模型回调来支持装饰器或显式调用。 但是,如果您确定需要此回调,那么为什么不尝试跳过回调除非 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? 的方法,因为这不是模型的责任。该模型不应取决于用户正在进行的操作是什么。