好的,似乎很少有“破坏”用户会话的方法,它们之间可能存在微妙之处以及应用程序如何处理用户会话。
首先,为什么大多数示例都不使用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 = nil
或session.destroy
是否更安全?这将完全破坏哈希。如果您的应用支持,请将current_user_id
保留在您的会话哈希中是有意义的...说跟踪匿名用户?!?!
思考?
答案 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