我有一个购物车,可以添加一个项目,并且将显示购物车,显示购物车中的商品数量为1,当我将相同的商品添加到购物车时,它会被添加但是购物车不会更新,直到我再次添加项目或同一项目,或刷新购物车。 添加相同的第三项将更新购物车并显示正确的数量,它只是在添加第二个相同项目后不会更新,并且在页面刷新或添加不同之前将数量显示为少一个推车!
代码主要来自“agile web dev with rails”3.2版本。
line_items/create.js.erb
if ($('#cart tr').length > 0) { $('#cart').show(); }
$('#cart').html("<%=j render @cart %>");
class LineItemsController < ApplicationController
def create
@cart = current_cart
item = Item.find(params[:item_id])
@line_item = @cart.add_item(item.id)
respond_to do |format|
if @line_item.save
puts @cart
format.js { @current_item = @line_item}
format.html { redirect_to store_url,
notice: "#{item.name} added to cart." }
format.json { render json: @line_item,
status: :created, location: @line_item }
else
format.html { render action: "new" }
format.json { render json: @line_item.errors,
status: :unprocessable_entity }
end
end
end
end
carts/show.html.haml
= render @cart
carts/_cart.html.haml
= render cart.line_items
line_items/_line_item.html.erb
<% if line_item == @current_item %>
<tr id="current_item">
<% else %>
<tr>
<% end %>
<td><%= line_item.quantity %> ×</td>
<td><%= line_item.item.name %></td>
<td class="item_price"><%= number_to_pounds(line_item.total_price) %></td>
</tr>
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
# attr_accessible :title, :body
def add_item(product_id)
current_item = line_items.find_by_item_id(product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(item_id: product_id)
end
current_item
end
答案 0 :(得分:0)
@cart对象总是落后一步,因为它在保存后没有更新。
保存在line_items控制器中后设置@cart = current_cart
,就像使用一样
而是在渲染购物车视图时@cart.reload
。