我遇到了一个问题,我使用AJAX对其进行了部分编写,出于某种原因public class ShortCut implement Parcelable{
//rest of code
}
呈现了其中的产品数量。因此,如果有2个产品,它会遍历所有line_items
2次,导致它列出4个元素而不是2个。所以循环继续按行line_items中的产品数量计算。
在line_items
我有:
create.js.erb
和我的$('#shopping-cart').html("<%= escape_javascript render(@cart) %>");
:
_cart
问题出在<div id="shopping-cart">
<div id="shopping-cart-header">
</div>
<div id="shopping-cart-items">
<table>
<%= render cart.line_items %>
<tr class="total-line">
<td colspan="2">Total</td>
<td class="total-cell"><%= number_to_currency(cart.total_price, unit: '') %></td>
</tr>
</table>
<%= button_to 'Empty cart', cart, method: :delete %>
</div>
<div id="shopping-cart-footer">
<%= link_to 'New order', new_order_path, class: 'btn btn-main btn-lg', data: { no_turbolink: true } %>
</div>
</div>
我想:
render cart.line_items
如果我现在添加了2个产品,它们就会显示两次:
<% @cart.line_items.each do |item| %>
<% if line_item == @current_item %>
<tr id="current-item">
<% else %>
<tr>
<% end %>
<td><%= item.quantity %> ×</td>
<td>
<p><%= item.product.name %></p>
<% if item.line_item_attributes.exists? %>
<% item.line_item_attributes.each do |attribute| %>
<i><%= attribute.product_attribute.name %></i>
<% end %>
<% end %>
</td>
<td class="item-price"><%= number_to_currency(item.total_price, unit: '') %></td>
</tr>
<% end %>
任何人都知道发生了什么事吗?我的日志是:
1 × red shirt 490.00
1 × blue shirt 89.00
1 × red shirt 490.00
1 × blue shirt 89.00
Total 579.00
似乎渲染_line_items,然后呈现_cart(它再次包含line_items) - 这可能是个问题吗?
答案 0 :(得分:2)
你是对的。当你致电render cart.line_items
时,你正在渲染一个集合。引用Rails文档,
当您通过:collection选项将集合传递给partial时,将为集合中的每个成员插入一次partial:
<h1>Products</h1>
<%= render partial: "product", collection: @products %>
(这与您的render cart.line_items
相同)
然后在部分内容中,您可以访问product
(或您的案例中为line_item
)局部变量,如下所示:
<p>Product Name: <%= product.name %></p>
所以:重写部分视图以表示具有相应line_item
变量而不是集合的单个line_item。