如何在销毁记录后跳过保存记录

时间:2014-09-13 10:54:53

标签: ruby-on-rails ruby-on-rails-4

我创建了一个购物车,用户可以增加和减少商品的数量。在逐个递减项目数量时出现问题。例如,当我有“2x Pizza”,其中2是比萨饼的数量时,我将其数量减少一个。那么我就有了“1x Pizza”。当我再次减少数量时,我收到错误can't modify frozen Hash

我的代码:

def RemoveItemQuantity
  @cart      = current_cart
  menu       = Menu.find(params[:menu_id])
  @line_item = @cart.sub_menu(menu.id)

  if @line_item != nil
    respond_to do |format|
      if @line_item.save
        # ...
      end
    end
  end
end

def sub_menu(menu_id)
  current_item = line_items.where(:menu_id => menu_id).first

  if current_item
    current_item.quantity -= 1
  end

  if current_item.quantity == 0
    current_item.destroy
  end

  current_item
end

当项目数量变为0时,我会销毁current_item。在此之后,由于can't modify frozen Hash错误,它无法保存记录。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

发生错误是因为您正在尝试保存已销毁的记录。我想解决问题的最简单方法是确保在同一个地方进行保存和销毁。

您可以稍微重构一下代码方法:

def remove_item_quantity
  @cart      = current_cart
  menu       = Menu.find(params[:menu_id])
  @line_item = line_items.where(:menu_id => menu_id).first

  if @line_item
    respond_to do |format|
      if @cart.sub_menu(@line_item)
        # ...
      end
    end
  end
end

def sub_menu(current_item)
  if current_item.quantity > 1
    current_item.update(quantity: current_item.quantity - 1)
  else
    current_item.destroy
  end
end

请注意,我在@line_item中查找了remove_item_quantity。由于您已经检查该项是否存在,因此我将调用移至sub_menu块内的respond_to

sub_menu只是检查商品的数量是否高于1。如果是,则递减1并保存记录。如果数量为1,则在递减时将变为0,因此在不更新计数器的情况下销毁它。

sub_menu现在总是在保存销毁记录成功时返回true

答案 1 :(得分:0)

我相信你不能对ActiveRecord对象进行就地数学赋值。您需要适当的更新方法。

尝试更改:

current_item.quantity -= 1

要:

current_item.update_column( :quantity, current_item.quantity - 1 )