我刚刚使用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">
答案 0 :(得分:4)
好的,这是2天后,我发现了。这就是我必须做的事情 -
<% 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 %>
productsize = params[:productsize]
@cart.add_product(product, productsize)
必须从params获取产品,然后将其与产品型号的其余部分一起传递到购物车模型的add_product操作。
@items << CartItem.new(product, productsize)
将其与产品型号的其余部分一起传递,以创建新的购物车项目并将其添加到项目中。
attr_reader :product, :quantity, :productsize
def initialize(product, productsize)
@product = product
@productsize = productsize
读取productsize并初始化购物车项目。
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的建议,并用表格替换按钮。