2014-09-21 86 views
0

好的,似乎很少有'破坏'用户会话的方法,它们之间可能存在细微差别以及应用程序如何处理用户会话。在Rails中销毁用户会话的简洁方法

首先,为什么大多数示例不使用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是有意义的!!?!

想法?

回答

0

通过将会话设置为零,您即将失去有关会话的所有信息(可能还包括current_user或Rails使用的内容)+您正在冒险使用散列方法(如#[])无,这会引发你异常,你不会期望它。

+0

谢谢@konole - 这是有道理的,从一个异常的角度...两个想法也许值得更新的答案1)我可以简单地使用'self.current_user = session [:current_user_id] = nil'和2)'session.delete(:return_to)'真的属于执行重定向的方法......如果您同意,您可以更新吗? ? – user1322092 2014-09-21 15:50:50

+0

是的,你可以。尽管多任务会影响分配并使其更难读。你甚至可以将更多的分配给零(C风格ftw),尽管人们更喜欢逐行获取它们。 ;) 关于session.delete(:return_to) - 它包含了什么? – konole 2014-09-21 15:53:55

+0

好吧,我看到你关于多任务的点,所以让我们保持这种方式。 ':return_to'是认证之后重定向用户的页面。''redirect_to(session [:return_to] || default)' – user1322092 2014-09-21 15:57:53

0

正确的做法是使用导轨方法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 
+0

使用'temp_sess = session.dup',然后重设会话,后面跟着'session.replace(temp_sess) '可能会更容易:-)请看这里http://brettu.com/rails-daily-ruby-tips-99-use-reset_session-before-authentication/一个很好的例子! – user1322092 2014-09-21 16:15:56

+0

更容易,也许,但效果不佳。这可能需要你刻意去除的元素。 – 2014-09-21 17:04:45