CartItem
控制器和CartItem
模型处理向CartItems
表添加项。Cart视图是通过调用CartItem
模型和控制器来呈现的。单击"结账"时,我想将CartItem
表中为给定卡保存的所有项目转移到OrderItem
表中。
在购物车视图页面上单击"结账"时,应发生以下情况:来自Cart view
的呼叫订单控制器
<%= button_to "Checkout", controller: 'orders', action: 'create' %>
订单管理员
def create
@order = Order.new
if logged_in?
@order[:user_id] = current_user.id #This works
end
#Need help: call Order_Items_Controller create action
if @order.save
flash[:success] = "Order created"
else
flash[:danger] = "Failed"
end
redirect_to checkout_address_path
end
订单项控制器
def create
#retrieve all records from Cart_Items where cart_id matches cookies[:cart_id]
@order_item = @order.order_items.build!(CartItem.where(:cart_id => cookies[:cart_id]))
#Need help: add order_id for current order to each record
#Need help: save the cart_items to the order_items table and handle exceptions
end
订单模型
class Order < ActiveRecord::Base
has_many :order_items
end
订单项目模型
class OrderItem < ActiveRecord::Base
belongs_to :order
validates :order_id, presence: true
end
我为什么要这么做?订单成功处理后,相应的CartItems数据将被删除,因此卡片为空。OrderItems存储已完成订单的数据,以便购物者可以在线查看订单历史记录。
您考虑过模型/数据结构的设置吗?
具体来说,将一个模型中的数据复制到另一个模型是非常低效的。使用foreign_key
将Order
模型链接到购物车会更好:
#app/models/cart.rb
class Cart < ActiveRecord::Base
#stores cart items for processing
belongs_to :order
has_many :cart_items
end
#app/models/order.rb
class Order < ActiveRecord::Base
#stores final values (IE delivery service id, cart id, payment id etc)
belongs_to :user
belongs_to :delivery
belongs_to :payment
has_one :cart
end
这样,您就可以调用以下命令:
#app/controllers/carts_controller.rb
class CartsController < ApplicationController
def checkout
@cart = current_user.cart #-> or however you call it
@order = @cart.order.new order_params
if @order.save
#-> remove cart from session etc etc
end
end
private
def order_params
params.require(:order).permit(:delivery_id, :user_id, :payment_id)
end
end
显然是非常高级的,但非常描述性的——Order
变成了一个美化的联接模型,允许您编译一个具有相对数量&项目,同时使用Order
管理交付和付款等。