Rails 购物车 - 未添加到当前订单
Rails Shopping Cart - not adding to current order
Rails 菜鸟在这里。
我正在构建一个基本的购物车,它之前运行良好。在不更改任何代码的情况下(我 git 重置 --hard 到我之前提交的它正在工作的地方)它就坏了。 (?!?) 细目如下:
Github 回购:https://github.com/christinecha/michaka
创建一个产品。 ✓
将产品 ID 添加到新订单项目。 ✓
向订单添加订单项目。 ✓
--
可能的问题
! - 在您创建订单商品时不断创建新订单 = 购物车始终为空。
! - 购物车未连接到正确的订单 ID
! - 正在触发新会话 = 新订单 = 问题
--
订单项目控制器
class OrderItemsController < ApplicationController
def create
@order = current_order
@order_item = @order.order_items.new(order_item_params)
@order.save
session[:order_id] = @order.id
end
def update
@order = current_order
@order_item = @order.order_items.find(params[:id])
@order_item.update_attributes(order_item_params)
@order_items = @order.order_items
end
def destroy
@order = current_order
@order_item = @order.order_items.find(params[:id])
@order_item.destroy
@order_items = @order.order_items
end
private
def order_item_params
params.require(:order_item).permit(:quantity, :product_id)
end
end
SESSION_STORE.RB
Rails.application.config.session_store :cookie_store, key: '_bead-project_session'
订购型号
class Order < ActiveRecord::Base
belongs_to :order_status
has_many :order_items
before_create :set_order_status
before_save :update_subtotal
def subtotal
order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum
end
def subtotal_cents
subtotal * 100
end
private
def set_order_status
self.order_status_id = 1
end
def update_subtotal
self[:subtotal] = subtotal
end
end
应用程序控制器
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
helper_method :current_order
def current_order
if !session[:order_id].nil?
Order.find(session[:order_id])
else
Order.new
end
end
end
看起来 ProductsController#create 被调用了两次,一次使用 html 格式,一次使用 json.
我认为您正在通过 ajax 提交一些数据,但仍在通过表单执行 post 请求。但是,在所有 javascript 操作完成之前,您的控制器的 format.html
响应正在重定向。
由于您仅保存@order 并设置了OrderItemsController#create 的会话,该会话在您初始ajax() 后由js 调用。成功后,收到重定向时它是不完整的。
我认为点击会发生什么:
- ajax post 请求和常规形式 post
- ajax成功->提交#order_item_product_id表单
- 按原始形式重定向 post 响应
我建议重新设计提交流程以通过常规形式提交 post 或完全通过 js 提交。例如,您可以从表单中禁用 post 并更改 OrderItemsController#create 以最终重定向(通过 js)render :js => "window.location.href = '/cart';"
Rails 菜鸟在这里。
我正在构建一个基本的购物车,它之前运行良好。在不更改任何代码的情况下(我 git 重置 --hard 到我之前提交的它正在工作的地方)它就坏了。 (?!?) 细目如下:
Github 回购:https://github.com/christinecha/michaka
创建一个产品。 ✓
将产品 ID 添加到新订单项目。 ✓
向订单添加订单项目。 ✓
--
可能的问题
! - 在您创建订单商品时不断创建新订单 = 购物车始终为空。
! - 购物车未连接到正确的订单 ID
! - 正在触发新会话 = 新订单 = 问题
--
订单项目控制器
class OrderItemsController < ApplicationController
def create
@order = current_order
@order_item = @order.order_items.new(order_item_params)
@order.save
session[:order_id] = @order.id
end
def update
@order = current_order
@order_item = @order.order_items.find(params[:id])
@order_item.update_attributes(order_item_params)
@order_items = @order.order_items
end
def destroy
@order = current_order
@order_item = @order.order_items.find(params[:id])
@order_item.destroy
@order_items = @order.order_items
end
private
def order_item_params
params.require(:order_item).permit(:quantity, :product_id)
end
end
SESSION_STORE.RB
Rails.application.config.session_store :cookie_store, key: '_bead-project_session'
订购型号
class Order < ActiveRecord::Base
belongs_to :order_status
has_many :order_items
before_create :set_order_status
before_save :update_subtotal
def subtotal
order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum
end
def subtotal_cents
subtotal * 100
end
private
def set_order_status
self.order_status_id = 1
end
def update_subtotal
self[:subtotal] = subtotal
end
end
应用程序控制器
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
helper_method :current_order
def current_order
if !session[:order_id].nil?
Order.find(session[:order_id])
else
Order.new
end
end
end
看起来 ProductsController#create 被调用了两次,一次使用 html 格式,一次使用 json.
我认为您正在通过 ajax 提交一些数据,但仍在通过表单执行 post 请求。但是,在所有 javascript 操作完成之前,您的控制器的 format.html
响应正在重定向。
由于您仅保存@order 并设置了OrderItemsController#create 的会话,该会话在您初始ajax() 后由js 调用。成功后,收到重定向时它是不完整的。
我认为点击会发生什么:
- ajax post 请求和常规形式 post
- ajax成功->提交#order_item_product_id表单
- 按原始形式重定向 post 响应
我建议重新设计提交流程以通过常规形式提交 post 或完全通过 js 提交。例如,您可以从表单中禁用 post 并更改 OrderItemsController#create 以最终重定向(通过 js)render :js => "window.location.href = '/cart';"