我正在我的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
答案 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。