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