“会话”来自哪里?

时间:2014-06-30 21:41:34

标签: ruby-on-rails ruby session

我正在我的rails应用程序中构建一个会话控制器,我只是不确定为什么有些东西在这里工作。在创建和销毁操作中,session[index]被分配给nil或用户ID。但是这个会话哈希没有在任何地方定义(据我所见)。这为什么有效?谁能为我澄清这个?

(为了清楚起见,没有会话模型)

  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

2 个答案:

答案 0 :(得分:3)

session实例方法的功能类似于Hash,是Rails API的一部分。

Rails完成了设置加密,防篡改会话数据存储的所有工作。默认情况下,会话数据在浏览器中保存为cookie。您可以指定其他存储机制,但CookieStore是默认设置,最方便。

config / initializers / session_store.rb 文件中设置了CookieStore默认值:

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

您可以在Rails中了解有关会话的更多信息:

有关详细信息,我编写了一份Rails Devise Tutorial,其中显示了如何使用Devise身份验证gem管理会话。

答案 1 :(得分:1)

默认情况下,会话存储在客户端的cookie中(即用户的浏览器cookie)。它不存储在服务器端(即Rails应用程序实际运行的位置。)

当您使用session哈希时,Rails足够聪明,可以相应地查找/请求会话信息。在默认情况下,Rails知道在浏览器的cookie中设置会话信息,或从浏览器的cookie中检索信息。

您还可以通过设置config.session_store配置变量来pick where to put your session store

有关详细信息,请参阅Rails guide