在此代码中:
<
% @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 %>
查看代码,这是我对正在发生的事情的理解,我是否理解正确或者我错过了什么?
在该代码中,我们创建了一个文本为“添加到购物车”的按钮,然后我们就是 将产品变量的product_id传递给它,即将到来 从那个for-each循环顶部并告诉它转到link_items页面 ID为product_id的产品的POST方法。
另外一个问题:在lines_items_path中我们可以通过product.product_id吗?或那不起作用?
答案 0 :(得分:1)
我只是理解你的另一个问题。答案是:代码将product.id
的值分配给符号product_id
。符号product_id
即将用于下一步(可能用于创建关联,其中product_id
的值将成为关键)。您的问题“为什么只是product
,而不是product.id
”才是合理的。答案是在Rails框架的约定中 - 如果你想使用对象的ID,你只需省略.id
部分,Rails就可以正确猜测。
您无法通过product.product_id
,因为型号产品没有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
更具描述性。