2013-03-30 40 views
1

敏捷星期三發展捕獲訂單章與Rails使用下面的代碼:倉庫的購物車如何保留其訂單項?

# orders_controller.rb 
def create 
    @order = Order.new(params[:order]) 
    @order.add_line_items_from_cart(current_cart) 
    if @order.save 
     Cart.destroy(session[:cart_id]) 
     session[:cart_id] = nil 
     redirect_to store_url 
    else 
     @cart = current_cart 
     render 'new' 
    end 
end 

    # order.rb 
    def add_line_items_from_cart(cart) 
    cart.line_items.each do |item| 
     item.cart_id = nil 
     line_items << item 
    end 
    end 

怎樣的車保留其行項目時,有一個驗證錯誤?在我們知道訂單是否有效之前,add_line_items_from_cart運行。它行項目與訂單相關聯,然後設置item.cart_id爲nil:

item.cart_id = nil 
self.line_items << item # self is an instance of `Order`. 

當我提交一個空的表單,然後查看車,所有的行項目仍然存在。這怎麼可能?我錯過了什麼?

回答

1

購物車只有在訂單被保存時纔會銷燬。所以我想它永遠不會丟失物品。會發生什麼情況是,當您創建訂單時,它可能會摧毀當前的購物車,並創建一個新的購物車。

+0

我明白這一點。但關聯是'LineItem belongs_to:cart'。當我們遍歷行項目並將'cart_id'設置爲'nil'時,購物車被銷燬並沒有什麼區別--'line_item.cart_id'現在是'nil'。我懷疑這是在'@ order.save'返回'false'時Rails回滾事務,但我還沒有驗證這一點。仍在研究它。 – dee

+1

Nop,實際上發生的是您更改了cart_id,但如果它無效,它不會保存到數據庫。所以它不會保存數據庫中的line_items。說得通? –

+0

雖然我不保存訂單項。 'item.cart_id = nil' then'self.line_items << item',其中'self'是order的實例...所以line_item驗證甚至不起作用。這是我試圖保存的訂單失敗的原因,但在更改訂單項中的cart_id後。 – dee

相關問題