Ruby on rails Rails购物车在销毁时返回产品数量

Ruby on rails Rails购物车在销毁时返回产品数量,ruby-on-rails,cart,Ruby On Rails,Cart,我是rails新手,有一个简单的产品商店网站。当用户将产品添加到购物车或更新购物车中的商品数量时,它将根据需要从基本产品数量中添加/删除。但是,当他们清空购物车(删除/销毁购物车)时,不会恢复基本产品数量,就好像他们没有购买任何东西一样。如何更新销毁方法以将列出的行_项目返回到原始产品数量 line_items_controller.rb-将购物车中的一个产品线_项目完全清空并增加基本产品数量的示例方法: def empty product = Product.find(params[:pr

我是rails新手,有一个简单的产品商店网站。当用户将产品添加到购物车或更新购物车中的商品数量时,它将根据需要从基本产品数量中添加/删除。但是,当他们清空购物车(删除/销毁购物车)时,不会恢复基本产品数量,就好像他们没有购买任何东西一样。如何更新销毁方法以将列出的行_项目返回到原始产品数量

line_items_controller.rb-将购物车中的一个产品线_项目完全清空并增加基本产品数量的示例方法:

def empty
  product = Product.find(params[:product_id])
  @line_item = @cart.empty_product(product)
  @total = @line_item.quantity
  product.increment!(:quantity, @total)

  respond_to do |format|
    if @line_item.save
      format.html { redirect_to :back, notice: 'Product removed.' }
      format.js
      format.json { render :show, status: :ok, location: @line_item }
    else
      format.html { render :edit }
      format.json { render json: @line_item.errors, status: :unprocessable_entity }
    end
  end
end
carts/show.html.erb-调用销毁/清空购物车:

<%= link_to 'Empty Cart', @cart, method: :delete, data: {confirm: 'Are you sure you want to empty your cart?'}, :class => 'btn btn-danger whiteText' %>
carts_controller.rb-我正在尝试做的事情(我认为这可能有问题,因为它不知道如何解决product=product.find(params[:product_id]):

编辑

试图更改销毁方法:

def destroy
  if @cart.id == session[:cart_id]
    @cart.line_items.each do |l|
      product = Product.where(:id => l.product_id)
      @total = @l.quantity
      product.increment!(:quantity, @total)
    end
    @cart.destroy
  end
  session[:cart_id] = nil
  respond_to do |format|
    format.html { redirect_to root_path, notice: 'Cart was emptied.' }
    format.json { head :no_content }
  end
end
它给我以下错误,即使我能够使用增量!关于行\项目\控制器中的产品数量:

undefined method `increment!' for #<Product::ActiveRecord_Relation:0xb5ad1b4>

对于编辑零件后出现的错误,您必须

  product = Product.where(:id => l.product_id)
  @total = @l.quantity
  product.increment!(:quantity, @total)
方法不返回单个产品,它返回产品关系(可能只包含一个产品)

最好是

  product = Product.find_by(:id => l.product_id)
  @total = @l.quantity
  product.increment!(:quantity, @total)

…这将返回一个产品对象。

对于有关销毁的问题,您实际上可以在模型级别执行此操作

在您的LineItem模型上,您可以执行

before_destroy { |record| record.product.increment!(:quantity, record.quantity }
这假定行项目具有

belongs_to :product

并且无论行项目记录在何处被销毁,都将确保更新产品数量。

您可以将产品id存储在行项目中(行项目属于产品),这样您就不需要在参数中传递产品id。请参阅原始问题中的编辑。这不是很清楚;你能分离出引起错误的代码吗?在rails控制台中复制它错误在product.increment上!销毁方法中的(:quantity,@total)。这是我在此控制器中查找产品所需的路径。谢谢这非常有效,但当结帐完成后,它会将购物车中的产品数量返回到原始产品。也就是说,放在购物车中的东西从产品数量中删除,但在结帐后返回。你有什么想法吗?所以你删除了已完成的订单?好的,您可以通过检查购物车状态来处理这个问题。或者您可以执行“删除”而不是“销毁”,这不会执行回调。一个可能的解决方案是在我编辑的答案中。
  product = Product.find_by(:id => l.product_id)
  @total = @l.quantity
  product.increment!(:quantity, @total)
before_destroy { |record| record.product.increment!(:quantity, record.quantity }
belongs_to :product