在Rails中销毁用户会话的简明方法

时间:2014-09-21 15:33:56

标签: ruby-on-rails ruby-on-rails-4

好的,似乎很少有“破坏”用户会话的方法,它们之间可能存在微妙之处以及应用程序如何处理用户会话。

首先,为什么大多数示例都不使用session.delete(:current_user_id)来删除:current_user_id值(及其哈希键!)?典型示例如下所示(我添加了删除:return_to,因为如果退出,为什么需要跟踪return_to值)。

  def sign_out
    self.current_user = nil
    session[:current_user_id] = nil
    session.delete(:return_to)
  end

如果应用需要删除所有会话变量和值,那么仅使用session = nilsession.destroy是否更安全?这将完全破坏哈希。如果您的应用支持,请将current_user_id保留在您的会话哈希中是有意义的...说跟踪匿名用户?!?!

思考?

2 个答案:

答案 0 :(得分:0)

通过将会话设置为nil,您将丢失有关会话的所有信息(除了current_user或Rails使用时也可能包含这些信息)+您将自己置于使用哈希方法(如#[])的风险之上这会引起你不期望的异常。

答案 1 :(得分:0)

执行此操作的正确方法是使用rails方法reset_session。如果你想坚持会话的某些部分,我会在你的应用程序控制器中使用这样的东西:

  def reset_session_with_persistence(*keys_to_persist)
    persisted_flash = flash
    persisted_keys = keys_to_persist.inject({}) { |keys, key| keys.merge( { key => session[key] } ) }

    reset_session

    persisted_flash.each { |key, value| flash[key] = value }
    keys_to_persist.each { |key_to_persist| session[key_to_persist] = persisted_keys[key_to_persist] }
  end