【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%>&times;</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%>

 

 

 

posted on 2010-11-19 18:26  张小捷  阅读(372)  评论(0编辑  收藏  举报

导航