2014-06-30 86 views
2

我正在建立一個會議控制器在我的Rails應用程序,我只是不知道爲什麼這裏有什麼工作。在創建和銷燬操作中,將session[index]分配給nil或用戶標識。但是這個會話散列沒有在任何地方定義(據我所知)。爲什麼這個工作?任何人都可以爲我澄清這一點?'會話'從哪裏來?

(爲了清楚起見,沒有會話模型)

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.find_by_email(params[:email]) 
    if user && user.authenticate(params[:password]) 
     session[:user_id] = user.id 
     redirect_to products_url, :note => "Logged in!" 
    else 
     render "new" 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to products_url, :notice => "Logged out!" 
    end 
end 

回答

3

session實例方法的功能類似於一個Hash和是Rails API的一部分。

Rails負責設置加密的防篡改會話數據存儲的所有工作。默認情況下,會話數據在瀏覽器中保存爲cookie。您可以指定其他存儲機制,但CookieStore是默認和最方便的。

CookieStore默認設置在配置/初始化/ session_store.rb文件:

Rails.application.config.session_store :cookie_store, key: '_learn-rails_session' 

您可以瞭解更多關於會議在Rails的:

欲瞭解更多信息,我寫了一個Rails Devise Tutorial,它顯示瞭如何使用Devise身份驗證gem管理會話。

1

默認情況下,會話存儲在客戶端(即用戶瀏覽器的cookie)的cookie中。它不存儲在服務器端(即Rails應用程序實際運行的地方)。

當您使用session散列時,Rails非常聰明,可以相應地查看/詢問會話信息。在默認情況下,Rails知道在瀏覽器的cookie中設置會話信息,或者從瀏覽器的cookie中檢索信息。

您還可以通過設置config.session_store配置變量pick where to put your session store

查看Rails guide瞭解更多信息。