2014-09-21 82 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