`

Rails之购物车

 
阅读更多

跟着agile_web_development_with_rails_3rd_edition.pdf教材实现一个购物车的程序

1,使用session存储用户购买信息

2,结合form_tag的remote功能以及jquery实现刷新部分页面

 

> rails -v

3.2.13

 

记录购物车部分关键代码如下:

view/layout/store.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <title>Pragprog Books Online Store</title>
  <%= stylesheet_link_tag "depot", :media => "all" %>
  <%= javascript_include_tag "application" %>
</head>
<body id="store">
  <div id="banner">
    <%= @page_title || "Pragmatic Bookshelf" %>
  </div>
  <div id="columns">
    <div id="side">
	  <!-- 动态变化部分,使用_cart.html.erb模板 -->
	  <div id="cart">
        <%= render(:partial => "cart" , :object => @cart) %>
      </div>
      <a href="http://www....">Home</a><br />
      <a href="http://www..../faq">Questions</a><br />
      <a href="http://www..../news">News</a><br />
      <a href="http://www..../contact">Contact</a><br />
    </div>
    <div id="main">
	  <!-- 只显示一次flash数值,一般用于错误提示 -->
	  <% if flash[:notice] -%>
        <div id="notice"><%= flash[:notice] %></div>
      <% end -%>
	  <!-- 加载 index.html.erb 替换于此 -->
      <%= yield :layout %>
    </div>
  </div>
</body>
</html>

view/store/index.html.erb

<h1>购物清单</h1>
<% for product in @products %>
<div class="entry">
<%= image_tag(product.image_url) %>
<h3><%=h product.title %></h3>
<%= product.description %>
<div class="price-line">
<span class="price" ><%= number_to_currency(product.price) %></span>
<!-- 关键代码,使用form_tag,设置remote -->
<%= form_tag({:action => 'add_to_cart', :id => product}, :remote => true) do %>
<%= submit_tag "Add to Cart" %>
<% end %>
</div>
</div>
<% end %>

 model部分代码如下

model/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

model/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
	  current_item = CartItem.new(product)	#否则,新建商品ID,存入购物车
      @items << current_item
    end
	current_item
  end
  
  def total_price
    @items.sum { |item| item.price } #计算总价格
  end
  
end

controller部分

class StoreController < ApplicationController
  def index
    @products = Product.find_products_for_sale
	@cart = find_cart
  end
  
  def add_to_cart
    begin
	  product = Product.find(params[:id])	#错误商品ID,记录日志以及flash变量
    rescue ActiveRecord::RecordNotFound
	  logger.error("Attempt to access invalid product #{params[:id]}")
	  flash[:notice] = "Invalid product"
	  redirect_to :action => 'index'
	else									#查询已购商品发送给add_to_cart.js.erb模板执行
	  @cart = find_cart                   
      @current_item = @cart.add_product(product)
	  respond_to do |format|
        format.js	#use add_to_cart.js.erb to render
      end
    end	  
  end

  def empty_cart
    session[:cart] = nil
    flash[:notice] = "Your cart is currently empty"
	@cart = find_cart
	respond_to do |format|
       format.js	#use add_to_cart.js.erb to render
    end
  end
  
private

  def find_cart
    session[:cart] ||= Cart.new
  end
  
  def redirect_to_index(msg = nil)
    flash[:notice] = msg if msg
    redirect_to :action => 'index'
  end
end

 此外还有供前端调用的回调部分代码

view/store/add_to_cart.js.erb

//add_to_cart(action)会将这段代码传给浏览器执行
$('#cart').html("<%= escape_javascript(render(:partial => "cart" , :object => @cart)) %>");

view/store/empty_cart.js.erb

//empty_cart(action)会将这段代码传给浏览器执行
$('#cart').html("<%= escape_javascript(render(:partial => "cart" , :object => @cart)) %>");

 partial部分代码

view/store/_cart.html.erb

<% unless cart.items.empty? %>
<div class="cart-title">Your Cart</div>
<table>
<!-- 使用_cart_item.html.erb模板 -->
<%= render(:partial => "cart_item" , :collection => cart.items) %>
<tr class="total-line">
<td colspan="2">Total</td>
<td class="total-cell"><%= number_to_currency(cart.total_price) %></td>
</tr>
</table>
<!-- 清空购物车按钮,也是远程调用无刷新更改页面 -->
<%= form_tag({:action => 'empty_cart'}, :remote => true) do %>
<%= submit_tag "Empty Cart" %>
<% end %>
<% end %>

view/store/_cart_item.html.erb

<% if cart_item == @current_item %>
<tr id="current_item">
<% else %>
<tr>
<% end %>
<td><%= cart_item.quantity %>&times;</td>
<td><%=h cart_item.title %></td>
<td class="item-price"><%= number_to_currency(cart_item.price) %></td>
</tr>
分享到:
评论

相关推荐

    rails敏捷开发的购物车系统

    在本文中,我们将深入探讨如何使用Rails敏捷开发技术构建一个购物车系统,特别是在参考《rails敏捷开发第四版》中的示例。Rails 3.2.6是本文的基础框架,它是一个强大的Ruby Web应用程序框架,以其MVC(模型-视图-...

    web开发之rails最新调试通过购物车代码

    本压缩包中的"web开发之rails最新调试通过购物车代码"是关于使用Rails进行Web应用开发的一个实例,特别是针对购物车功能的实现。 购物车是电商网站的核心部分,它允许用户选择商品并保存这些选择以便后续购买。在...

    rails敏捷开发,我的成功之路

    **标题与描述**:本书《Rails敏捷开发,我的成功之路》是一本详细介绍如何使用Rails框架进行高效、快速的网站开发的专业书籍。作者通过丰富的实例来阐述Rails框架的优势及其在敏捷开发中的应用。 **详细说明**:...

    Ruby-Rails实战之B2C商城开发

    在本项目"Ruby-Rails实战之B2C商城开发"中,我们将深入探索使用Ruby on Rails这一强大的Web开发框架来构建一个完整的B2C(Business-to-Consumer)在线商城。Rails是Ruby语言的一个核心框架,以其MVC(Model-View-...

    rails 项目起步示例

    Rails是Ruby语言的一个著名Web开发...随着对Rails框架的深入理解,你可以逐步构建出功能丰富的购物系统,包括商品浏览、购物车、订单处理等功能。在实际操作中,参考Rails的官方文档和社区资源将是提升技能的好方法。

    《web开发敏捷之道 应用rails进行敏捷web开发》(第一版)的depot源代码

    《Web开发敏捷之道:应用Rails进行敏捷Web开发》是一本深入探讨如何利用Ruby on Rails框架进行高效、敏捷的Web应用程序开发的书籍。该书的第一版提供了名为"depot"的源代码示例,旨在帮助读者更好地理解Rails的工作...

    Rails 3 in Action

    第九章讨论了 **文件上传** 的实现方式,这是 Web 应用中常见的功能之一。 - **文件上传**: - 实现用户可以上传图片、文档等文件的功能。 - 需要考虑安全性问题,防止恶意文件上传。 - 可以使用第三方服务,如 ...

    shopping_card_rails-源码.rar

    《购物车实现——深入解析"shopping_card_rails"源码》 在软件开发中,购物车功能是电子商务网站的核心组成部分,它允许用户选择商品并进行结算。本篇文章将深入探讨"shopping_card_rails"源码,揭示其在实现购物车...

    Agile Web Development with Rails中文版 3rd Edition

    ### 敏捷Web开发之Rails应用详解(第三版) #### 一、Rails的敏捷特性及其在Web开发中的应用 本书《敏捷Web开发之Rails应用详解》第三版主要介绍了如何使用Ruby on Rails框架来进行敏捷Web开发。Rails是一个用Ruby...

    Secrets of ruby on rails

    Rails的设计哲学之一就是“约定优于配置”(Convention over Configuration)。这一理念强调的是通过提供一组合理的默认设置来减少开发过程中的配置工作量。例如,在创建一个新的Rails应用时,默认情况下会自动配置...

    agile-web-development-with-rails_2

    Rails自2004年发布以来,已经成为Web开发领域中最受欢迎的框架之一。 **重要性:** - **高效开发:** Rails强调“约定优于配置”,这意味着开发者可以快速搭建应用程序而无需过多的配置。 - **生产力提升:** Rails...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    在随后的“Rails框架“部分中,作者深入介绍了Rails框架的各个组件。 除了上述两部分外,对Rails缺乏了解的读者应该首先阅读“起步”部分,通过一个最简单的应用示例感性了解这个时下热门的web框架。不熟悉Ruby的...

    Web 开发敏捷之道(应用Rails 进行敏捷Web 开发第三版)

    ### Web 开发敏捷之道 —— 应用 Rails 进行敏捷 Web 开发 第三版 #### 一、Rails 的背景与发展 **Rails**,全称为 **Ruby on Rails**,是一种用于构建 Web 应用的开源框架,由 David Heinemeier Hansson 在 2004 ...

    shopper-cart:基于 Ruby on Rails 构建的基本购物车

    《基于 Ruby on Rails 构建的基本购物车系统详解》 Ruby on Rails(简称Rails)是一种流行的开源Web应用程序框架,它以其“约定优于配置”的理念和强大的MVC(模型-视图-控制器)架构赢得了开发者们的青睐。在本文...

Global site tag (gtag.js) - Google Analytics