私はいくつかの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
ヴィシュヌ:
ので、終了コードは、このでした。私はレールコンソールに入るとき。私はまだOrderとCartの両方で空の配列を取得しています。 – powerup7
'@ order.save'は成功しましたか?いくつかの検証エラーがありますか? '@ order.save! 'を実行すると、検証に失敗するとエラーが発生します。 'current_cart'とその' cart_items'を初期化する方法を私たちに示すことができるなら、もっと役に立ちます – aBadAssCowboy
はい@ order.saveが成功したと確信しています。 Order.destroy_allとCartItems.destroy_allを使ってdb内のレコードをクリアするので、アクションを実行し、Railsコンソールでobjet generateという新しいレコードを取得します。私は救いました!エラーはなかった。私はすぐにいくつかのデバッグコードを載せます。 – powerup7