0

我有一个购物车,可以添加一个项目,并且购物车将显示购物车中数量为 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 %> &times;</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
4

1 回答 1

0

@cart 对象总是落后一步,因为它在保存后没有更新。@cart = current_cart在 line_items 控制器中保存后的 设置有效,就像@cart.reload在渲染购物车视图时使用一样。

于 2013-06-25T19:03:49.160 回答