【问题标题】:Rails & Devise - how to determine when a user is logging out?Rails & Devise - 如何确定用户何时注销?
【发布时间】:2020-08-22 22:47:47
【问题描述】:

在我的 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-rails ruby authentication devise


    【解决方案1】:

    你真的想一开始就使用模型回调吗?他们本质上很老套,控制他们被解雇的时间和地点通常变得越来越困难。

    如果您只是覆盖控制器,您就知道该逻辑将在何处被触发,并且它不会减慢您的测试或产生更多意想不到的错误。

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

    【讨论】:

      【解决方案2】:

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

      def your_callback_method
        return unless remember_created_at
      
        #do stuff
      end
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多