Rails购物车-未添加到当前订单 [英] Rails Shopping Cart - not adding to current order
问题描述
在这里滑行新手。
我正在构建一个基本的购物车,并且之前运行良好。它没有更改任何代码(我git reset --hard到我上次提交的地方很难工作)就坏了。 (?!?)以下是细分:
Github回购: https://github.com/christinecha/michaka
-
创建产品。 ✓
-
将产品ID添加到新的订单商品。 ✓
-
将订单商品添加到订单中。 ✓
-
可能的问题
! -创建订单商品时,新订单会不断创建=购物车始终为空。
! -购物车未连接到正确的订单ID
! -触发了新会话=新订单=问题
-
订购商品控制器
类OrderItemsController< ApplicationController
def创建
@order =当前订单
@order_item = @ order.order_items.new(order_item_params)
@ order.save
session [:order_id] = @ order.id
结束
def更新
@order =当前订单
@order_item = @ order.order_items.find(params [:id])
@ order_item.update_attributes(order_item_params)
@order_items = @ order.order_items
结束
def销毁
@order =当前命令
@order_item = @order .order_items.find(params [:id])
@ order_item.destroy
@order_items = @ order.order_items
结束
私人
def order_item_params
params.require(:order_item).permit(:quantity,:product_id)
结束
结束
SESSION_STORE.RB
Rails.application.config.session_store:cookie_store,密钥:'_bead-project_session'
订购模型
类订单< ActiveRecord :: Base
属性_to:order_status
has_many:order_items
before_create:set_order_status
before_save:update_subtotal
def小计
order_items.collect { | oi | oi.valid? ? (oi.quantity * oi.unit_price):0} .sum
结束
def subtotal_cents
小计* 100
结束
私人
def set_order_status
self.order_status_id = 1
结束
def update_subtotal
self [:小计] =小计
结束
结束
应用控制器
class ApplicationController< ActionController :: Base
protected_from_forgery具有::exception
helper_method:current_order
def current_order
if!session [:order_id] .nil?
Order.find(session [:order_id])
其他
Order.new
结束
结束
结束
看起来ProductsController#create被调用了两次,一次是html格式,一次是json。 / p>
我认为您正在通过ajax提交一些数据,但仍在从表单中进行发布请求。但是,控制器的 format.html
响应将在所有JavaScript操作完成之前重定向。
您只需保存@order并从OrderItemsController#create设置会话,该会话在您的初始ajax()之后由js调用。成功,当接收到重定向时它是不完整的。
我认为点击会发生以下情况:
- ajax发布请求和常规表单发布
- ajax成功->提交#order_item_product_id表单
- 通过原始表单后回复重定向
重新设计提交过程以通过常规表单发布或完全通过js提交。例如,您可以从表单中禁用发布,并将OrderItemsController#create更改为最终重定向(通过js) render:js => window.location.href =‘/ cart’;
Rails noob here.
I'm building a basic shopping cart and it was working perfectly before. Without changing any code (I git reset --hard to my prev commit where it was working) it broke. (?!?) Here's the breakdown:
Github Repo: https://github.com/christinecha/michaka
Creates a product. ✓
Adds Product ID to a new Order Item. ✓
Adds Order Item to an Order. ✓
--
Possible Issues
! - New Orders keep being created as you create Order Items = cart is always empty.
! - Cart is not connecting to the right Order ID
! - New sessions are being triggered = new Orders = problem
--
ORDER ITEMS CONTROLLER
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'
ORDER MODEL
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
APPLICATION CONTROLLER
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
It looks like ProductsController#create is called twice, once with format html and once as json.
I think you're submitting some of your data via ajax but still doing a post request from the form. However your controller, in it's format.html
response is redirecting before all of the javascript actions have completed.
Since you only save @order and set the session from OrderItemsController#create which is called by js after your initial ajax().success, it is incomplete when the redirect is received.
What I think happens on click:
- ajax post request AND regular form post
- ajax success -> submit #order_item_product_id form
- redirected by original form post response
I would suggest either redesigning the submit process to submit through regular form post or entirely through js. For example you could disable post from the form and change OrderItemsController#create to finally redirect (via js) render :js => "window.location.href = '/cart';"
这篇关于Rails购物车-未添加到当前订单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!