2016-07-22 11 views
0

Ich versuche einige ActiveRecord Methoden in OrdersController # neue Aktion aufzurufen. Ich habe den Code in Rails Console getestet und es funktioniert so, wie ich es vorhabe. Aber in der Controller-Aktion ist es nicht die gleichenProbleme mit Active Record Rails 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 

Jetzt current_cart produzieren ist eine application_controller Methode, wenn der aktuelle Benutzer prüft einen Warenkorb hat. Ist dies der Fall, wird der Einkaufswagen aus der Datenbank abgerufen. Wenn der Benutzer dies nicht tut, erstellt er einen neuen Einkaufswagen für den Benutzer. Was ich hier versuche, ist, wenn der Benutzer seine Bestellung abschließt. Ich versuche die cart_items von current_cart in Bestellungen zu übertragen und dann den Warenkorb zu löschen.

Wenn ich dies in Rails-Konsole mache, gibt es mir was ich will. Bestelle mit cart_items, die in current_cart waren, und nachdem ich destroy_all auf dem Warenkorb ausgeführt habe, habe ich ein leeres aktives Record Association Array.

Wenn ich das in meinem Controller teste, geben Order und Cart ein leeres aktives Assoziationsarray zurück.

Was geht hier vor?

#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 

Antwort

0

Okay, es herausgefunden.

Ich benutzte @ order.save, die die Fehlermeldung nicht verarbeitet wurde !!!!!!!! Nach @ order.save! es gab mir den Validierungsfehler in einem anderen Modell. Ich habe das kommentiert und es hat funktioniert.

Ich iterierte current.cart_items und zugewiesen die Cart_id zu Null und order_id zu @ order.id im Wesentlichen clearing den Warenkorb und "Übertragen" der Elemente über.

Ich konnte einen Weg mit der Verwendung von destroy_all jedoch nicht herausfinden. Ich denke, das ist unmöglich wie @Sri sagte.

Vielen Dank!

So ist der End-Code war:

@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

Wenn Sie sagen, Sie die cart_items von current_cart übertragen Sie auf die Objekte vorbei sind, können Sie keine neuen cart_items schaffen (was bedeutet, dass die Datenbank-IDs gleich sind), und wenn Sie current_cart.cart_items.destroy_all tun, ist es um sie von der Löschung Datenbank. Siehe ActiveRecord::Relation#destroy_all

Für Sie Fall verwenden, reicht es, wenn Sie gerade tun

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

    current_cart.cart_items = [] 
end 
+0

Vishnu, das nicht funktioniert. Wenn ich in die Rails-Konsole gehe. Ich bekomme immer noch leere Arrays für Order und Cart. – powerup7

+0

Sind Sie sicher, dass '@ order.save' erfolgreich war? Kann es Validierungsfehler geben? Probieren Sie '@ order.save!' Aus und es wird ein Fehler angezeigt, wenn Validierungen fehlschlagen. Es wäre hilfreicher, wenn Sie uns zeigen könnten, wie Sie 'current_cart' und seine' cart_items' initialisieren. – aBadAssCowboy

+0

Ja Ich bin sicher, dass @ order.save erfolgreich war. Da ich die Datensätze in der Datenbank mit Order.destroy_all und CartItems.destroy_all lösche, führe die Aktion aus und erhalte einen neuen Auftragsdatensatz/Objekt-Generator in Rails Console. Ich habe versucht zu sparen! und es gab keine Fehler. Ich werde bald einen Debugging-Code aufsetzen. – powerup7

Verwandte Themen