3

我刚刚学习了使用 Rails 3rd Ed. 进行敏捷 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">

4

4 回答 4

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)

必须从参数中获取 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 %>

为用户显示它。

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

于 2008-11-11T04:28:00.633 回答
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 %>
于 2008-11-10T16:37:50.363 回答
0

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

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

于 2008-11-10T14:08:50.040 回答
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 %>
于 2008-11-09T16:34:58.577 回答