【问题标题】:Rails Cart Return Product Quantities on DestroyRails 购物车在销毁时返回产品数量
【发布时间】:2017-07-19 14:04:02
【问题描述】:

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

line_items_controller.rb - 完全清空购物车中的一个产品 line_item 并增加基础产品数量的示例方法:

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 - 当前销毁购物车的方法:

def destroy
  @cart.destroy if @cart.id == session[:cart_id]
  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

carts_controller.rb - 我正在尝试做什么(我认为这可能存在问题,因为它不知道如何解决 product = Product.find(params[:product_id])):

def destroy
  @cart.destroy if @cart.id == session[:cart_id]
    @cart.line_items.each do
      product = Product.find(params[:product_id])
      @total = @line_item.quantity
      product.increment!(:quantity, @total)
    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

编辑

试图改变销毁方法:

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

它给了我以下错误,即使我能够使用增量!关于 line_items_controller 中的产品数量:

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

还尝试将路径直接调用到购物车控制器方法中。它显示购物车已成功清空,但当我在 html 中调用此相同方法时,产品数量并未返回到应有的样子:

if @cart.id == session[:cart_id]
  @cart.line_items.each do |l|
    empty_line_item_path(product_id: l.product)
  end
  @cart.destroy
end

【问题讨论】:

  • 您可以将product_id存储在line item中(line_item属于product),这样就不需要在params中传递product id了。
  • 查看原始问题中的编辑。
  • 不是很清楚;你能隔离在rails控制台中引发错误的代码吗
  • 错误是在destroy方法中product.increment!(:quantity, @total)。

标签: ruby-on-rails cart


【解决方案1】:

关于销毁的问题,你实际上可以在模型级别做到这一点。

在您的 LineItem 模型上,您可以这样做...

before_destroy { |record| record.product.increment!(:quantity, record.quantity }

这假设 LineItem 有...

belongs_to :product

并且无论 line_item 记录在哪里被销毁,都将确保更新产品数量。

【讨论】:

  • 这很好用,但是当结帐完成后,它会将购物车中的产品数量退回到原始产品。意思是,放入购物车的东西从产品数量中删除,但在结帐后退回。关于如何解决这个问题的任何想法?
  • 所以你删除了已完成的订单?好的,您也许可以通过检查购物车状态来解决这个问题。或者你可以做“delete”而不是“destroy”,它不会做回调。一种可能的解决方案是在我编辑的答案中。
【解决方案2】:

对于您在编辑部分之后的错误,您有...

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

where 方法不返回单个产品,它返回一个产品关系(无论如何可能只包含一个产品)。

最好...

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

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

【讨论】:

  • 这是我在此控制器中查找产品所需的路线。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 2022-10-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2010-12-20
相关资源
最近更新 更多