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?
的方法,因为这不是模型的责任。该模型不应取决于用户正在进行的操作是什么。
在我的 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?
的方法,因为这不是模型的责任。该模型不应取决于用户正在进行的操作是什么。