2016-07-22 4 views
0

私はいくつかのActiveRecordメソッドをOrdersController#newアクションで呼び出そうとしています。 Rails Consoleでコードをテストしたところ、意図したとおりに動作します。 しかし、コントローラのアクションでは、同じアクティブレコードレールの問題4

order has_many cart_items 
    cart has_many cart_items 
    cart_items belong_to order cart_items 
    belong_to cart 
    cart_items belong_to product 
    product has_many cart_items 

def new 
    @order.new 
    @order.cart_items = current_cart.cart_items 
    @order.save 

    current_cart.cart_items.destroy_all 
end 

を生成しません。今current_cartは、現在のユーザーが、ショッピングカートを持っているかどうかを確認するapplication_controller方法です。もしそうであれば、データベースからそのカートを引っ張り、ユーザがそれをしなければ、ユーザの新しいカートを作成する。私がここでやろうとしているのは、ユーザーが注文を確定したときです。cart_itemsをcurrent_cartからordersに転送してから、ショッピングカートをクリアしようとしています。

これをレールコンソールで行うと、私は自分が望むものを与えます。 current_cartにあったcart_itemsで注文し、カートでdestroy_allを実行した後、空のアクティブレコードアソシエーションの配列があります。

コントローラでこれをテストすると、OrderとCartは空のアクティブな関連配列を返します。

ここでは何が起こっていますか?

#application controller method of finding current_users cart 
    def current_cart 
    # if user is logged in 
    if current_user 
     @user = current_user 
     # checking user to see if account is confirmed and verified 
     if @user.confirmed_at != nil 

     # checking if user already has cart in cart database 
     if Cart.find_by(users_id: @user.id) != nil 
      # find a row in the database where users_id: equal to @user.id 
      # where clause does not work here 
      cart = Cart.find_by(users_id: @user.id) 
      session[:cart_id] = cart.id 
      cart.save 
      #establish Cart session cart for user 
      Cart.find(session[:cart_id]) 
     else 
      # create a new Cart Object for user.assign current_user's id to cart object 
      cart = Cart.new 
      cart.users_id = @user.id 
      # save it to get cart id assign session[:cart_id] == cart.id 
      cart.save 
      session[:cart_id] = cart.id 
     end 
     end 
    end 
    end 



class CartItemsController < ApplicationController 
    before_action :set_cart_item, only: [:show, :edit, :update, :destroy] 
# scope for most_recent and subtotal 
# find out if rails sorts on update column cuz this is annoying. 


    def create 
    # grabbing cart from application controller current_cart method 
    @cart = current_cart 
    # session[:cart_id] = @cart.id 
    # individual product items get added to cart item and added to cart and saved 
    @cart_item = @cart.cart_items.build(cart_item_params) 
    @cart.save 
    end 

    def update 
    @cart = current_cart 
    # finding cart_items by cart_id 
    @cart_item = @cart.cart_items.find(params[:id]) 
    # @cart_items.order(:id) 
    @cart_item.update_attributes(cart_item_params) 
    @cart_items = @cart.cart_items.order(:id) 
    # redirect 'cart_show_path' 
    @cart.save 
    end 

    def destroy 
    @cart = current_cart 
    @cart_item = @cart.cart_items.find(params[:id]) 
    @cart_item.destroy 
    @cart_items = @cart.cart_items 
    @cart.save 
    end 

    private 
    def set_cart_item 
     @cart_item = CartItem.find(params[:id]) 
    end 

    def cart_item_params 
     params.require(:cart_item).permit(:cart_id, :product_id, :unit_price, :quantity, :total_price) 
    end 
end 

答えて

0

をすれば、その十分のActiveRecord::Relation#destroy_all

を参照してください、それを考え出しました。

エラーメッセージを処理していない@ order.saveを使用していました!!!!!!!! @ order.saveの後に!それは私に別のモデルの検証エラーを与えました。 私はそれをコメントし、それは働いた。

私はcurrent.cart_itemsを繰り返し、cart_idをnilに、order_idを@ order.idに割り当てました。これは基本的にカートをクリアし、項目を「転送」します。

私はdestroy_allを使って方法を見つけることができませんでした。 @Sriのようにこれは不可能だと私は思う。

ありがとう!動作しません

@order = Order.create!(users_id: current_cart.users_id) 

current_cart.cart_items.each do |item| 
    item.order_id = @order.id 
    item.save! 
end 

if @order.save 
    current_cart.cart_items.each do |item| 
    item.cart_id = nil 
    item.save! 
end 
2

あなたは、あなたがオブジェクトの上に渡しているcurrent_cartからcart_itemsを転送していると言うとき、あなたは(データベースIDが同じであることを意味する)新しいcart_itemsを作成していないとあなたがcurrent_cart.cart_items.destroy_allを行うときに、それはから削除されデータベース。あなたはケースを使用するためにあなただけのよし

def new 
    @order.new 
    @order.cart_items = current_cart.cart_items 
    @order.save 

    current_cart.cart_items = [] 
end 
+0

ヴィシュヌ:

ので、終了コードは、このでした。私はレールコンソールに入るとき。私はまだOrderとCartの両方で空の配列を取得しています。 – powerup7

+0

'@ order.save'は成功しましたか?いくつかの検証エラーがありますか? '@ order.save! 'を実行すると、検証に失敗するとエラーが発生します。 'current_cart'とその' cart_items'を初期化する方法を私たちに示すことができるなら、もっと役に立ちます – aBadAssCowboy

+0

はい@ order.saveが成功したと確信しています。 Order.destroy_allとCartItems.destroy_allを使ってdb内のレコードをクリアするので、アクションを実行し、Railsコンソールでobjet generateという新しいレコードを取得します。私は救いました!エラーはなかった。私はすぐにいくつかのデバッグコードを載せます。 – powerup7

関連する問題