about 1 year ago

这是 购物网站 第二周复盘笔记的疑问记录:关于 session 的疑问。

在实作 购物网站 5-4 Step 2 : 加入购物车代码 中出现这样一段代码:

app/controllers/application_controller.rb
  def find_cart
    cart = Cart.find_by(id: session[:cart_id])
    if cart.blank?
      cart = Cart.create
    end
    session[:cart_id] = cart.id
    return cart
  end

1. session 是做什么用的?

参考资料:

iHower老师提到:

HTTP是一種無狀態的通訊協定,為了能夠讓瀏覽器能夠在跨request之間記住資訊,因此基於瀏覽器的 Cookies,Rails 再提供了所謂的 Session 可以更方便的操作,用來記住登入的狀態、記住使用者購物車的內容等等。

还是好抽象,没能理解。。。

这篇文章借用 “买鸡排”的生活场景来解释 sessioncookie 的含义,非常形象易懂!

我去买鸡排,结账后老板给我一张号码牌,等到炸好后再用号码牌来领鸡排
在这里 session 就是那张号码牌,由那家鸡排店的老板发给你,记得这个鸡排是谁的


2. cookie 又是做什么用的?

刚刚的 session 是你每次去鸡排店,都会拿到新的一张号码牌
而 cookie 就是那间鸡排店发给你的一张会员卡,记录你的个人信息
既然会员卡放在使用者身上:
使用者可以自行丢掉(自行删除 cookie
到期自动失效( cookie 过期会不能使用 )
也就是说,我把一些不重要的信息,存在使用者的电脑中
下次使用者进来,我可以很快的知道他的喜好
它的储存空间为 4kb


3. 为什么要用 sessioncookie

我们要先知道 HTTP 是一个 无状态(stateless) 的 protocol
什么意思???
没有 session 服务器就不能识别谁正在使用我们的网站
为什么要用 cookie
使用者与服务器没有一直保持连线的状况,所以在客户操作的时候
可以将资料存在 cookie ,需要连线时在一起将资料送给服务器
可以想成,跟店家拿菜单,自己选好要吃什么后,再送给店家处理
就是服务器不想要记住所有人的个人化资讯,你提供给我即可


Rails 内如何操作 session ?

定义:session[:cart_id] = cart.id
读取:session[:cart_id]
删除:session[:cart_id] = nil
清空:reset_session

← [学习笔记] ci 是什么? build 又是什么? [学习笔记] ||= 是什么? →
 
comments powered by Disqus