CartItem
控制器和CartItem
模型处理将项添加到CartItems
表。通过调用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
OrderItems Controller
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
OrderItems模型
class OrderItem < ActiveRecord::Base
belongs_to :order
validates :order_id, presence: true
end
为什么我要这样做?成功处理订单后,相应的CartItems数据将被删除,因此该卡为空。 OrderItems存储已完成订单的数据,以便购物者可以在线查看订单历史记录。
答案 0 :(得分:0)
您是否考虑过模型/数据结构的设置?
具体而言,将一个模型中的数据复制到另一个模型是非常低效的。使用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
来管理交付和付款等。