2014-09-13 82 views
0

我創建了一個購物車,其中用戶可以增加或減少某個項目的數量記錄後保存記錄。逐項遞減項目的數量時出現問題。例如,當我有「2倍比薩」,其中2是比薩的數量時,我將其數量減1。那麼我有「1倍比薩」。當我再次遞減數量時,出現錯誤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

我相信你無法做到就地數學分配ActiveRecord對象。你需要一個適當的更新方法。

嘗試改變:

current_item.quantity -= 1 

要:

current_item.update_column(:quantity, current_item.quantity - 1) 
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 

請注意,我在remove_item_quantity查找@line_item。由於您已經在檢查項目是否存在,我將電話移至respond_to區塊內的sub_menu

sub_menu簡單地檢查,如果該項目具有比1更高的量。如果是,則減1,並保存記錄。如果數量爲1,則遞減時它將變爲0,因此在不更新計數器的情況下銷燬它。

sub_menu當保存破壞記錄成功時,現在總是返回true