0

在这段代码中:

<

    % @products.each do |product| %>
      <div class="entry">
        <%= image_tag(product.image_url) %>
        <h3><%= product.title %></h3>
        <p><%= sanitize(product.description) %></p>
        <div class="price_line">
          <span class="price"><%= number_to_currency(product.price) %></span>
    <!-- START_HIGHLIGHT -->
          <%= button_to 'Add to Cart', line_items_path(product_id: product),
            remote: true %>
    <!-- END_HIGHLIGHT -->
        </div>
      </div>
    <% end %>

在底部我们有传递参数的 button_to 方法:

    <%= button_to 'Add to Cart', line_items_path(product_id: product),
        remote: true %>

查看代码,这是我对正在发生的事情的理解,是我理解正确还是遗漏了什么?

在该代码中,我们正在创建一个带有“添加到购物车”文本的按钮,然后我们将 prodcut 变量的 product_id 传递给它,它来自顶部的 for-each 循环并告诉它转到 link_items 页面ID 为 product_id 的产品的 POST 方法。

另一个问题:在 lines_items_path 我们可以只传递 product.product_id 吗?或者那行不通?

4

2 回答 2

1

我刚刚明白你的另一个问题。答案是:代码将值赋给product.id符号product_id。该符号product_id将用于下一步(可能用于创建关联,其中的值product_id将成为键)。你的问题“为什么公正product,而不是product.id”将是合理的。答案在 Rails 框架的约定中——如果你想使用对象的 ID,你只需省略.id部分,Rails 就会正确猜测。

您不能通过product.product_id,因为模型 Product 没有product_id方法或属性(您更喜欢哪个)。它有.id.

请澄清你问题的第一部分。

编辑(问题的第一部分 - 一步一步)

@products.each do |product|- 循环遍历对象数组(@products 是对象数组,由控制器的操作组成,如下所示:@products= Product.all或类似)。在每一步,里面的代码都do .. end对局部变量进行操作product。这是一个对象,对应于数据库的一行,因此它具有“属性”(对应于列),如 product.id 、 product.name 等。

然后创建与提取的数据库行数一样多的按钮。

关于按下哪个按钮的信息由新变量携带(在这种情况下以符号的形式 - 一个特殊的 Ruby 术语,值得研究:))因此,您将 product.id 的值分配给它,就像这样: product_id: product.id. 总结:你组成了局部变量product_id。此代码的旧样式::product_id => product更具描述性。

于 2013-01-21T22:07:57.290 回答
1

我认为这是《Agile Web Development with Rails》一书中的一个例子。我很久以前读过它...如果我没记错的话,有products,ordersline_items

如果你打电话rake routes,你会发现,作为line_items_pathPOST,是. 更多细节:CRUD 动词和动作createline_items_controller

因此,您将传递product_id给 create 操作,您应该在其中具有以下内容:

def create
  product = Product.find(params[:product_id])
...
end
于 2013-01-21T22:21:57.047 回答