2014-06-30 51 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了解更多信息。