`
fly_bluewolf
  • 浏览: 6341 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对于Agile Web Development with Rails, 2nd 中cart的疑惑

阅读更多
最近在看Agile Web Development with Rails第二版,同时在研究rails 2.1。在网上下载了Agile Web Development with Rails第三版的源码,发现第三版对于product全部采用了REST的方式实现了,但是对于cart的实现同第二版没有任何变化,还是放在StoreController中。
class ProductsController < ApplicationController
  # GET /products
  # GET /products.xml
  def index
    @products = Product.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @products }
    end
  end

  # GET /products/1
  # GET /products/1.xml
  def show
    @product = Product.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @product }
    end
  end

  # GET /products/new
  # GET /products/new.xml
  def new
    @product = Product.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @product }
    end
  end

  # GET /products/1/edit
  def edit
    @product = Product.find(params[:id])
  end

  # POST /products
  # POST /products.xml
  def create
    @product = Product.new(params[:product])

    respond_to do |format|
      if @product.save
        flash[:notice] = 'Product was successfully created.'
        format.html { redirect_to(@product) }
        format.xml  { render :xml => @product, :status => :created, :location => @product }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /products/1
  # PUT /products/1.xml
  def update
    @product = Product.find(params[:id])

    respond_to do |format|
      if @product.update_attributes(params[:product])
        flash[:notice] = 'Product was successfully updated.'
        format.html { redirect_to(@product) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /products/1
  # DELETE /products/1.xml
  def destroy
    @product = Product.find(params[:id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(products_url) }
      format.xml  { head :ok }
    end
  end
end

class StoreController < ApplicationController  
  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
      @current_item = @cart.add_product(product)
      if request.xhr?
        respond_to { |format| format.js }
      else
        redirect_to_index
      end
    end
  end
end

个人觉得/store/add_to_cart/1似乎很不REST,感觉cart应该有个单独的CartController,这样才比较REST。
不知道是否是由于第3版的代码没有完成的而造成的。
分享到:
评论
7 楼 fly_bluewolf 2008-06-22  
庄表伟 写道
我的理解是:

Controller应该分为两类:
一类是面向资源的,也就是CRUD的简单封装。
一类是面向Web请求的,自然会千奇百怪。

REST化的Controller,在做Web Service的时候,显得很自然,在做Web Page的时候,就总会有些格格不入的地方。

也许,这两类Controller,应该用在不同的层次上。

做个类比,cart就类似我们在supermarket中的手推车,用户在bookstore中浏览,就类似我们在超市中购物,用户挑选好一件东西,就放入到手推车中。在现实中,超市也不会把用户使用的手推车(cart)记录到微机系统中,也就说并不会持久化这些信息,这个跟我们在storebook看到cart的实现一致。但对用户这个角度来说,却可以认为cart也是一种资源,我们可以向手推车中进行CRUD操作吧(增加一件商品或拿出一件商品)。
如果把controller分成两种,一种是简单的REST化的controller,做CRUD的简单封装。我认为REST在企业级应用中就失去了它的意义,企业级应用不会只是简单的CRUD应用吧。
6 楼 neodoxy 2008-06-22  
庄表伟 写道
我的理解是:

Controller应该分为两类:
一类是面向资源的,也就是CRUD的简单封装。
一类是面向Web请求的,自然会千奇百怪。

REST化的Controller,在做Web Service的时候,显得很自然,在做Web Page的时候,就总会有些格格不入的地方。

也许,这两类Controller,应该用在不同的层次上。

就这个问题而言,还是可行的
因为在这个例子里cart没有被实现成一个ActiveRecord对象,也不是一种资源,当然可以用面向资源的方式实现,但对于AWD这本入门级的书籍的入门篇章来说,似乎复杂性太高了,这或许是Dave采用REST-RPC风格的一个原因吧
5 楼 庄表伟 2008-06-21  
我的理解是:

Controller应该分为两类:
一类是面向资源的,也就是CRUD的简单封装。
一类是面向Web请求的,自然会千奇百怪。

REST化的Controller,在做Web Service的时候,显得很自然,在做Web Page的时候,就总会有些格格不入的地方。

也许,这两类Controller,应该用在不同的层次上。
4 楼 fly_bluewolf 2008-06-21  
neodoxy 写道
让整个Rails社区向REST转变不是单靠激进就能解决的
那其实并不能简单地诠释为激进,而是一种决断力,敢于和主流背道而驰也是需要极大的勇气的

所以我认为他不应该还会在这部书里使用REST-RPC的方式
3 楼 neodoxy 2008-06-20  
让整个Rails社区向REST转变不是单靠激进就能解决的
那其实并不能简单地诠释为激进,而是一种决断力,敢于和主流背道而驰也是需要极大的勇气的
2 楼 fly_bluewolf 2008-06-20  
neodoxy 写道
这是最常见的REST-RPC方法
也就是REST和RPC混合的架构
按照REST的标准,语义完全体现在URL上,动作全部基于CRUD,这对于习惯了RPC模式的程序员来说瞬间的转变太难了,所以Rails2.0提供了对于RPC式的REST的支持,也允许这样做

你说的没错,可是在我印象中DHH可是非常激进的,ROR是坚决站在REST一方的,所以说这部书里应该不会出现这种REST-RPC的方式吧?
1 楼 neodoxy 2008-06-20  
这是最常见的REST-RPC方法
也就是REST和RPC混合的架构
按照REST的标准,语义完全体现在URL上,动作全部基于CRUD,这对于习惯了RPC模式的程序员来说瞬间的转变太难了,所以Rails2.0提供了对于RPC式的REST的支持,也允许这样做

相关推荐

    Agile+Web+Development+with+Rails中文版.pdf

    《Agile Web Development with Rails》是一本经典的Rails开发指南,中文版的出版使得更多的中国开发者能够深入理解并应用敏捷开发方法与Ruby on Rails框架。这本书是Rails开发者的必备参考资料,它详细介绍了如何...

    Agile Web Development with Rails 4

    Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details., Tens of thousands of ...

    Agile Web Development with Rails

    书中的"Pragmatic.Bookshelf.Agile.Web.Development.with.Rails.2nd.Edition.Dec.2006.eBook-BBL"可能是该书籍的电子版文件,它包含了全书的章节和内容。读者可以通过这个电子版深入学习Rails开发的各种技巧和最佳...

    Agile Web Development with Rails 1-14节_ppt(老师发的修正版)

    Agile Web Development with Rails 1-14节_ppt(老师发的修正版)

    agile web development with rails 5(英文电子书)

    agile web development with rails 5(英文电子书).............................................................................................................................................................

    Agile Web Development with Rails (PDF)

    《敏捷Web开发与Rails》是一本深度探讨如何利用Ruby on Rails框架进行敏捷Web开发的指导书籍,由Dave Thomas、David Heinemeier Hansson等多位在Rails社区有着深厚贡献的作者共同编写。本书不仅覆盖了Rails的基本...

    Agile Web Development with Rails, 2nd Edition

    Agile Web Development with Rails, 2nd Edition &lt;br&gt;有两份PDF文件,大小分别是7.39MB和6.55MB &lt;br&gt;作者: Dave Thomas , David Heinemeier Hansson , Leon Breedt , Mike Clark , James Duncan Davidson ,...

    Agile Web Development with Rails 2nd Edition源码

    通过对《敏捷Web开发与Rails 2nd Edition》的源码进行深入研究,开发者不仅能更好地理解Rails的工作原理,还能提升自己的编程技巧,从而在实际项目中更加游刃有余。无论是初学者还是经验丰富的开发者,都能从中...

    Pragmatic - Agile Web Development with Rails 2nd

    《Pragmatic - 敏捷Web开发与Rails第二版》是一本详实的技术指南,不仅覆盖了Rails框架的基础知识,还深入探讨了敏捷开发方法论,以及如何将这些理论应用于实际项目中,对于希望深入了解Rails框架并提升Web开发技能...

    Agile Web Development with Rails 3nd Edition Beta.pdf

    ### 敏捷Web开发与Rails 3:关键知识点解析 #### 一、Rails版本与兼容性 本书《敏捷Web开发与Rails》第三版是基于Rails 2编写的。截至本书印刷时,当前可用的Rails Gem版本为2.1。书中所包含的所有代码均已在该...

    Agile Web Development with Rails 2nd Edition

    ### 敏捷Web开发与Rails框架(第二版) #### 关于Rails版本的重要信息 Rails作为一个不断进化的框架,其核心开发者团队一直在进行各种改进、添加新功能以及修复已知问题等工作。随着时间推移,他们会定期将最新的...

    Agile Web Development with Rails 2nd

    《敏捷Web开发与Rails》第二版是一本专为Ruby on Rails框架设计的详细教程,旨在帮助开发者以敏捷的方式构建高效、可扩展的Web应用程序。这本书深入浅出地讲解了使用Ruby语言和Rails框架进行Web开发的核心概念和技术...

    Agile Web Development with Rails 4th edition(敏捷Web开发与Rails:程序指南 第四版)

    《敏捷Web开发与Rails:程序指南 第四版》是一本深度探讨使用Ruby on Rails框架进行敏捷Web应用开发的专业书籍。本书旨在帮助开发者充分利用Rails 4的特性,提高开发效率,实现快速迭代和高质量的代码编写。 Rails是...

    Agile Web Development with Rails,Fourth Edition 第四版

    《敏捷Web开发与Rails》第四版是一本专为软件开发者设计的权威指南,全面涵盖了使用Ruby on Rails框架进行敏捷Web应用开发的知识。Rails 3是该版本的重点,它引入了许多新特性和改进,使得开发过程更为高效且灵活。...

    Agile Web Development With Ruby On Rails第一及第二版

    在学习这两本书时,你可以从Pragmatic Programmer - Agile Web Development With Ruby On Rails_05.12.24.pdf和Pragmatic.Bookshelf.Agile.Web.Development.with.Rails.2nd.Edition.pdf中获取详细教程。这些PDF文件...

    Pragmatic - Agile Web Development with Rails

    《Pragmatic - Agile Web Development with Rails》是Ruby on Rails框架的经典教材,旨在引导初学者高效地学习敏捷Web开发。这本书的第三版于2009年发布,它结合了Pragmatic Programmers的实用主义理念与Ruby on ...

Global site tag (gtag.js) - Google Analytics