【ror学习笔记4】Session
在控制器中,Rails利用cookie维护了一个特殊的,类似于hash的集合,名为session。如果将一个名/值对保存在这个hash中,那么在处理同一个浏览器发出的后续请求时都可以获取到该名/值对。
一。配置session
1。rake db:sessions:create 定义session数据表
.2。rake db:migrate 在数据库创建数据表
.3。告诉rails把session保存在数据库中:
修改environment.rb以下第三行前#号去掉:
# Use the database for sessions instead of the file system
# (create the session table with 'rake db:sessions:create')
# config.action_controller.session_store = :active_record_store
.4。重启服务器
二。创建购物车模型和购物车货品模型
1.创建app/models/cart.rb
class Cart
attr_reader :items
def initialize
@items = []
end
def add_product(product)
current_item = @items.find{|item| item.product == product}
if current_item
current_item.increment_quantity
else
@items<<CartItem.new(product)
end
end
def total_price
@items.sum{|item| item.price}
end
end
2.创建app/models/cart_item.rb
class CartItem
attr_reader :product, :quantity
def initialize(product)
@product = product
@quantity = 1
end
def increment_quantity
@quantity +=1
end
def title
@product.title
end
def price
@product.price * @quantity
end
end
三。在控制器添加相关方法
class StoreController < ApplicationController
def index
@products = Product.find_products_for_sale
end
def add_to_cart
begin
@product = Product.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid product #{params[:id]}")
redirect_to_index("Invalid product")
else
@cart = find_cart
@cart.add_product(@product)
end
end
def empty_cart
session[:cart] = nil
redirect_to_index("Your cart is currently empty")
end
def redirect_to_index(msg)
flash[:notice] = msg
redirect_to :action => :index
end
private
def find_cart
session[:cart] ||=Cart.new
end
end
四。修改布局,修改页面,添加页面
1.app/views/store/index.rhtm添加<%= button_to "Add to Cart",:action=>:add_to_cart,:id=>product%>一句
<h1>Your Pragmatic Catalog</h1>
<%for product in @products -%>
<div class="entry">
<img src="<%=product.image_url %>"/>
<h3><%= h(product.title)%></h3>
<%=product.description%>
<div class="price"><%=number_to_currency(product.price)%></div>
<%= button_to "Add to Cart",:action=>:add_to_cart,:id=>product%>
</div>
<%end%>
2.app/views/layouts/store.rhtml修改如下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Pragprog Books Online Store</title>
<%= stylesheet_link_tag 'depot' ,:media=>"all"%>
</head>
<body id="store">
<div id="banner">
<!--<img src="/images/logo.png"/>-->
<%= @page_title || "Pragmatic Bookshelf"%>
</div>
<div id="columns">
<div id="side">
<a href="http://www....">Home</a><br/>
<a href="http://www..../faq">Question</a><br/>
<a href="http://www..../news">News</a><br/>
<a href="http://www..../contact">Contact</a><br/>
</div>
<div id="main">
<% if flash[:notice] -%>
<div id="notice"><%=flash[:notice] %></div>
<% end -%>
<%= yield:layout%>
</div>
</div>
</body>
</html>
3。app/views/store/add_to_cart.rhtml,一按add_to_cart按钮rails就会自动转到这个页面
<div class="cart-title">Your Cart </div>
<table>
<% for cart_item in @cart.items %>
<tr>
<td><%= cart_item.quantity%>×</td>
<td><%=h(cart_item.title)%></td>
<td class="item-price"><%= number_to_currency(cart_item.price) %></td>
</tr>
<%end%>
<tr class="total-line">
<td colspan = "2">Total</td>
<td class="total-cell"><%=number_to_currency(@cart.total_price) %></td>
</tr>
</table>
<%= button_to "Empty cart" , :action=>:empty_cart%>