当会话被销毁时,我的应用可以得到通知吗?如果是这样,怎么样?

时间:2011-07-25 18:28:15

标签: ruby-on-rails-3 session devise warden

My Devise / Warden-based app在session []变量中存储模型ID。我想在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

重述一个问题:我应该如何以及何时销毁向导对象?

2 个答案:

答案 0 :(得分:0)

通过会话,您的意思是当用户退出时?

尝试猴子修补sign_out application_controller.rb方法 您可以在lib/devise/controllers/helpers.rb

中找到相关的Gem代码
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

答案 1 :(得分:0)

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

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