Rails程序中Cookies是什么?其实现机制如何?
嘿,我完全懂你在学Rails 4.0教程时的困惑——浏览器的Cookie概念你门儿清,但一到Rails里怎么用就懵了,尤其是sessions_helper里直接用cookies的写法,总觉得它“无依无靠”对吧?别慌,我给你拆解清楚:
1. Rails里的cookies到底是什么?
它可不是凭空冒出来的,而是Rails框架自动注入到请求上下文里的特殊对象,本质是ActionDispatch::Cookies::CookieJar的实例。这个上下文包含了控制器、视图,还有你用到的helper——也就是说,只要是在处理请求的这些环节里,你都能直接调用cookies,不用手动实例化,也不用把它绑定到某个特定类(比如Sessions类)上。
2. 为什么sessions_helper里能直接用cookies?
因为Rails的helper模块会被混入到控制器和视图的上下文环境中,helper里定义的方法,其实是在当前请求的上下文里执行的。打个比方,就像你在控制器里能直接用params一样,helper里也能直接拿到cookies这个全局可用的上下文对象,这就是教程里sessions_helper能操作Cookie的原因。
3. 举个教程里的实际例子
比如你在教程里看到的登录方法:
def log_in(user) session[:user_id] = user.id cookies.permanent[:remember_token] = user.remember_token end
这里的cookies.permanent[:remember_token]做了两件事:
- 告诉Rails要在响应头里添加
Set-Cookie字段,把remember_token和超长有效期(默认20年)发给浏览器 - 浏览器收到后会把这个Cookie存在本地,下次请求时自动带上
- 当用户再次访问时,Rails会把浏览器发来的Cookie封装成
cookies对象,你就能通过cookies[:remember_token]读取它
4. 补充一个小误区:session和cookies的关系
教程里的session[:user_id]其实也是基于Cookie实现的——Rails会把session数据加密后存在一个临时Cookie里(默认关闭浏览器就失效),而cookies是直接操作原生的浏览器Cookie,这就是两者的核心区别。
内容的提问来源于stack exchange,提问作者Brian Postow
相关产品推荐
相关产品推荐

