【问题标题】:Question about building a shopping cart/checkout with Rails关于使用 Rails 构建购物车/结账的问题
【发布时间】:2008-11-09 16:28:15
【问题描述】:

我刚刚学习了使用 Rails 第 3 版进行敏捷 Web 开发,我正在阅读 Depot 应用程序章节,我对产品/项目选项有疑问-

如果我想修改产品目录和商店以便产品可以有选项(尺寸、颜色等),我会在哪里/如何做?

假设我在卖 T 恤,它们有不同的尺码。我不觉得那是真正需要创建模型来处理尺寸的东西,所以我想我可以将它作为选择框添加到商店视图中的 html 中。

但是,每个“添加到购物车”按钮都由 button_to 自动生成的表单标签包裹,并且似乎无法让我将其他参数传递给我的购物车。如何获取添加到 POST 到 add_to_cart 的项目的大小?

也许更重要的是 - 最 Railsy 的方式是什么?

提前感谢您的帮助! --马克

我认为的帮手:

<%= button_to "Add to Cart" , :action => :add_to_cart, :id => product %>

它生成的表单:

<form method="post" action="/store/add_to_cart/3" class="button-to">

【问题讨论】:

    标签: ruby-on-rails cart shopping awdwr


    【解决方案1】:

    好的,2 天后,我想通了。这是我必须做的-

    1,在我的商店视图中:

    <% form_for @product, :url => {:action => "add_to_cart", :id => @product} do |f| %>
      <select name="productsize" id="productsize">
        <option value="L">L</option>
        <option value="XL">XL</option>
      </select>
      <%= f.submit 'Add to Cart' %>
    <% end %>
    

    2,添加到我的商店控制器:

    productsize = params[:productsize]
    @cart.add_product(product, productsize)
    

    必须从参数中获取 productsize,然后将其与产品模型的其余部分一起传递给购物车模型的 add_product 操作。

    3,调整购物车模型以接受参数,并且:

    @items << CartItem.new(product, productsize)
    

    将它与产品模型的其余部分一起传递,以创建一个新的购物车项目并将其添加到项目中。

    4,添加到 cart_item 模型中:

    attr_reader :product, :quantity, :productsize
    
    def initialize(product, productsize)
    @product = product
    @productsize = productsize
    

    读取 productsize 并初始化 Cart Item。

    5,添加到我的 add_to_cart 视图中:

    Size: <%=h item.productsize %>
    

    为用户显示它。

    就是这样。如果有更简单或更干燥的方法来解决它,我会全神贯注(眼睛?)。

    【讨论】:

      【解决方案2】:

      我不确定您为什么不存储 size,除非您的意思是将 size 作为 cart_item 而不是 product 的一部分存储,这很好。在这种情况下,你会做这样的事情:

      <% form_for(@cart_item) do |f| %>
      <%= f.select :size, ['S', 'M', 'L', 'XL', 'XXL'] %>
      <%= f.hidden_field :product_id, :value => @product.id %> 
      # other properties...
      <%= f.submit 'Add to Cart' %>
      <% end %>
      

      【讨论】:

      • 我同意。我会为 cart_item 模型添加尺寸。
      【解决方案3】:

      我会删除 button_to 助手并使用适当的表单,将产品属性提交给 add_to_cart 操作。

      <% form_for(@product) do |f| %>
      <%= f.select :size, ['S', 'M', 'L', 'XL', 'XXL'] %>
      # other properties...
      <%= f.submit 'Add to Cart' %>
      <% end %>
      

      【讨论】:

      • 这是朝着正确方向迈出的一步,但仅有助于在我的购物车视图中显示 size。我需要将 size 添加到我的购物车对象中,以便它实际与商品一起存储在我的购物车中。再次感谢您的帮助,我整个周末都在努力,但我显然不是程序员。 --马克
      【解决方案4】:

      您需要为模型添加属性。为此,您需要创建一个迁移来更新您的数据库表。我只有这本书的第 2 版,但有一个名为“迭代 A2:添加缺失的列”的部分描述了如何执行此操作。我假设第 3 版中会有类似的部分。

      完成后,您可以按照 Can Berk Güder 的建议,将按钮替换为表单。

      【讨论】:

        猜你喜欢
        • 2013-01-23
        • 1970-01-01
        • 2013-05-06
        • 2010-11-26
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 2011-08-01
        相关资源
        最近更新 更多