1:session 用法
应用程序将浏览器发送的请求与本地保存的session数据进行匹配。cookie来实现session。
cookie是指web应用传递给浏览器的一组数据,浏览器会将cookie保存在本地计算机上,当浏览器向web应用发送请求时,会根据cookie数据的信息将这一请求与服务器保存的session信息匹配。
Rails中,有一个类似于hash的集合,名为session。在处理请求的过程中,如果将一个名/值保存在这个hash中,那么在处理同一个浏览器发出的后续请求时都可以获取到该名/值对。
创建一个数据迁移任务来定义session数据表
rake db:sessions:create
实施这个迁移任务,就可以把数据库表建立出来
rake db:migrate
举例:在控制器中使用当前的session就像使用一个hash一样,用符号:cart作为它的索引。
(1) : 在一个显示页面(views/store/index.rhtml)
<% for product in @products %>
<%= link_to "添加到购物车" ,:action=>:add_to_cart,:id=>product %>
<% end %>
(2): 在控制器类(app/controllers/store_controller.rb)
def add_to_cart # views视图调用此方法
@cart=find_cart #find_cart 方法是从session中找出购物车对象(cart)
product=Product.find(params[:id]) #利用params对象从请求中取出id参数,Product模型根据id找出货品
@cart.add_product(product) #把该货品放入购物车
end
def find_cart
session[:cart] ||=Cart.new #Cart是购物车模型类
end
# ||= 是条件赋值操作符,如果 session中已经有:cart这个键,上述语句返回:cart键对应的值,否则,先新建一个Cart对象,将其放入session,返回新建对象
params是Rails一个对象,包含了浏览器请求传来的所有参数,params[:id]包含了将被action使用的对象id(主键)
(3:) 模型类Cart
class Cart
attr_reader:items
def initialize
@items=[]
end
def add_product(product)
@items<<product
end
end
(4):调用方法后返回页面(add_to_cart.rhtml)
<% for item in @cart.items %>
<%= item.title%>
<% end %>