我创建了一个购物车,用户可以增加和减少商品的数量。在逐个递减项目数量时出现问题。例如,当我有“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
错误,它无法保存记录。我在这里做错了什么?
答案 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 )