关于使用Rails构建购物车/结帐的问题

时间:2008-11-09 16:28:16

标签: ruby-on-rails cart shopping awdwr

我刚刚使用Rails 3rd Ed。选择了Agile Web Development,我将通过Depot Application章节,我对产品/项目选项有疑问 -

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

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

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

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

提前感谢您的帮助! --mark

我认为的帮手:

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

它生成的表单:

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

4 个答案:

答案 0 :(得分:4)

好的,这是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)

必须从params获取产品,然后将其与产品型号的其余部分一起传递到购物车模型的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并初始化购物车项目。

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

Size: <%=h item.productsize %>

为用户显示它。

就是这样。如果有一种更简单或更干燥的方式,那我就是耳朵(眼睛?)。

答案 1 :(得分:1)

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

<% 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 %>

答案 2 :(得分:0)

我会删除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 %>

答案 3 :(得分:0)

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

完成后,您可以按照CanBerkGüder的建议,并用表格替换按钮。