跟着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 %>×</td> <td><%=h cart_item.title %></td> <td class="item-price"><%= number_to_currency(cart_item.price) %></td> </tr>
相关推荐
在本文中,我们将深入探讨如何使用Rails敏捷开发技术构建一个购物车系统,特别是在参考《rails敏捷开发第四版》中的示例。Rails 3.2.6是本文的基础框架,它是一个强大的Ruby Web应用程序框架,以其MVC(模型-视图-...
本压缩包中的"web开发之rails最新调试通过购物车代码"是关于使用Rails进行Web应用开发的一个实例,特别是针对购物车功能的实现。 购物车是电商网站的核心部分,它允许用户选择商品并保存这些选择以便后续购买。在...
**标题与描述**:本书《Rails敏捷开发,我的成功之路》是一本详细介绍如何使用Rails框架进行高效、快速的网站开发的专业书籍。作者通过丰富的实例来阐述Rails框架的优势及其在敏捷开发中的应用。 **详细说明**:...
在本项目"Ruby-Rails实战之B2C商城开发"中,我们将深入探索使用Ruby on Rails这一强大的Web开发框架来构建一个完整的B2C(Business-to-Consumer)在线商城。Rails是Ruby语言的一个核心框架,以其MVC(Model-View-...
Rails是Ruby语言的一个著名Web开发...随着对Rails框架的深入理解,你可以逐步构建出功能丰富的购物系统,包括商品浏览、购物车、订单处理等功能。在实际操作中,参考Rails的官方文档和社区资源将是提升技能的好方法。
《Web开发敏捷之道:应用Rails进行敏捷Web开发》是一本深入探讨如何利用Ruby on Rails框架进行高效、敏捷的Web应用程序开发的书籍。该书的第一版提供了名为"depot"的源代码示例,旨在帮助读者更好地理解Rails的工作...
第九章讨论了 **文件上传** 的实现方式,这是 Web 应用中常见的功能之一。 - **文件上传**: - 实现用户可以上传图片、文档等文件的功能。 - 需要考虑安全性问题,防止恶意文件上传。 - 可以使用第三方服务,如 ...
《购物车实现——深入解析"shopping_card_rails"源码》 在软件开发中,购物车功能是电子商务网站的核心组成部分,它允许用户选择商品并进行结算。本篇文章将深入探讨"shopping_card_rails"源码,揭示其在实现购物车...
### 敏捷Web开发之Rails应用详解(第三版) #### 一、Rails的敏捷特性及其在Web开发中的应用 本书《敏捷Web开发之Rails应用详解》第三版主要介绍了如何使用Ruby on Rails框架来进行敏捷Web开发。Rails是一个用Ruby...
Rails的设计哲学之一就是“约定优于配置”(Convention over Configuration)。这一理念强调的是通过提供一组合理的默认设置来减少开发过程中的配置工作量。例如,在创建一个新的Rails应用时,默认情况下会自动配置...
Rails自2004年发布以来,已经成为Web开发领域中最受欢迎的框架之一。 **重要性:** - **高效开发:** Rails强调“约定优于配置”,这意味着开发者可以快速搭建应用程序而无需过多的配置。 - **生产力提升:** Rails...
在随后的“Rails框架“部分中,作者深入介绍了Rails框架的各个组件。 除了上述两部分外,对Rails缺乏了解的读者应该首先阅读“起步”部分,通过一个最简单的应用示例感性了解这个时下热门的web框架。不熟悉Ruby的...
### Web 开发敏捷之道 —— 应用 Rails 进行敏捷 Web 开发 第三版 #### 一、Rails 的背景与发展 **Rails**,全称为 **Ruby on Rails**,是一种用于构建 Web 应用的开源框架,由 David Heinemeier Hansson 在 2004 ...
《基于 Ruby on Rails 构建的基本购物车系统详解》 Ruby on Rails(简称Rails)是一种流行的开源Web应用程序框架,它以其“约定优于配置”的理念和强大的MVC(模型-视图-控制器)架构赢得了开发者们的青睐。在本文...