1

我的基于 Devise/Warden 的应用程序将模型 ID 存储在 session[] 变量中。我想在 session[] 被销毁时销毁对象。

  • 当会话被销毁时,是否有回调或某种机制来通知我的应用程序?
  • 该机制是否可靠,或者我应该运行一个夜间清理脚本来清理任何孤立的对象?

为了清楚起见,这是我的控制器代码的片段:

class WizardsController < ApplicationController
  before_filter :find_or_create_wizard
  ...
private

  def find_or_create_wizard
    @wizard = Wizard.find_by_id(session[:wizard_id]) || Wizard.create.tap {|w| session[:wizard_id] = w }
  end

end

重申问题:我应该如何以及何时销毁 Wizard 对象?

4

2 回答 2

0
Warden::Manager.before_logout do |user,auth,opts| 
  # callback 
end 

使用 Warden::Hooks https://github.com/hassox/warden/blob/master/lib/warden/hooks.rb在注销或身份验证后执行操作。

于 2012-02-08T01:30:17.420 回答
0

会话是指用户注销时吗?

尝试猴子修补您的sign_out方法application_controller.rb 您可以在中找到相关的 Gem 代码lib/devise/controllers/helpers.rb

def sign_out(resource_or_scope=nil)
    Wizard.find_by_id(session[:wizard_id]) || Wizard.create.tap {|w| session[:wizard_id] = w }
    super(resource_or_scope)
end

每当用户通过名为 的函数登录或注册时,会话数据也会被清除expire_session_data_after_sign_in!,也可以覆盖它:

def expire_session_data_after_sign_in!
        Wizard.find_by_id(session[:wizard_id]) || Wizard.create.tap {|w| session[:wizard_id] = w }
        super
end
于 2011-07-26T12:26:57.723 回答