Rails购物车-未添加到当前订单 [英] Rails Shopping Cart - not adding to current order

查看:73
本文介绍了Rails购物车-未添加到当前订单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这里滑行新手。



我正在构建一个基本的购物车,并且之前运行良好。它没有更改任何代码(我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调用。成功,当接收到重定向时它是不完整的。



我认为点击会发生以下情况:


  1. ajax发布请求和常规表单发布

  2. ajax成功->提交#order_item_product_id表单

  3. 通过原始表单后回复重定向

重新设计提交过程以通过常规表单发布或完全通过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:

  1. ajax post request AND regular form post
  2. ajax success -> submit #order_item_product_id form
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆