Rails问题与用户购物车

时间:2016-06-13 14:42:16

标签: ruby-on-rails ruby ruby-on-rails-4 e-commerce cart

我为一位客户提供了一个Rails购物车,但只是在第二次尝试“添加到购物车”时才有效。

所以每次点击“添加到购物车”,购物车第一次都是空的。但在第二次尝试时,该项目被添加到购物车。

我做错了什么?

以下是客户控制器代码:

 class Customer::CartsController < ApplicationController
   before_action :authenticate_user!
   def show
     @cart = if current_user
     current_user.cart ||= Cart.find_by(session[:cart_id])
     session[:cart_id] = nil if current_user.cart.purchased_at
  end
  if session[:cart_id].nil?
    current_user.cart = Cart.create!(user_id: params[:id])
    session[:cart_id] = current_user.cart.id 
  end
  @cart = current_user.cart
  end
end

普通推车控制器

 class CartsController < ApplicationController
 skip_before_action :authorize, only: [:create, :update, :destroy]
 before_action :set_cart, only: [:show, :edit, :update, :destroy]
 rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart

 def index
  @carts = Cart.all
 end

def show
end

def new
 @cart = Cart.new
end

def edit
end

def create
@cart = Cart.new(cart_params)

respond_to do |format|
  if @cart.save
    format.html { redirect_to @cart, notice: 'Cart was successfully created.'}
    format.json { render :show, status: :created, location: @cart }
  else
    format.html { render :new }
    format.json { render json: @cart.errors, status: :unprocessable_entity }
  end
end
end

def update
  respond_to do |format|
     if @cart.update(cart_params)
       format.html { redirect_to @cart, notice: 'Cart was successfully updated.' }
       format.json { render :show, status: :ok, location: @cart }
     else
       format.html { render :edit }
       format.json { render json: @cart.errors, status: :unprocessable_entity }
     end
    end
   end

 def destroy
  @cart.destroy if @cart.id == session[:cart_id]
  session[:cart_id] = nil
 end
 respond_to do |format|
  format.html { redirect_to root_path, notice: 'Your Cart is currently empty.' }
  format.json { head :no_content }
 end
end

private
  # Use callbacks to share common setup or constraints between actions.
 def set_cart
  @cart = Cart.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def cart_params
  params[:cart]
end

def invalid_cart
  logger.error "Attempt to access invalid cart #{params[:id]}"
  redirect_to root_path, notice: 'Invalid cart'
end
end

行项目控制器创建方法

def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id, params[:size])

respond_to do |format|
  if @line_item.save
    format.html { redirect_to customer_cart_path }
    format.json { render :show, status: :created, location: @line_item }
  else
    format.html { render :new }
    format.json { render json: @line_item.errors, status: :unprocessable_entity }
  end
end
end

任何帮助将不胜感激。提前谢谢!

3 个答案:

答案 0 :(得分:1)

如果没有看到完整的代码,很难确切知道这里发生了什么。例如,问题主要是在尝试将产品添加到购物车时发生的错误,但未显示add_product方法的定义。

我可以提供一些应该有用的建议。首先,show的{​​{1}}方法很难遵循。我已经重构它以删除不必要的嵌套if语句,并减少条件数。

Customer::CartsController

其次,在处理这样的错误时,您应该发现自己有一个更具体的问题(如果不是您的问题的答案)。为了得出这样一个特定问题,您需要进行调试以找出问题所在。您可以通过以下几种方式完成此操作:

  1. 最简单的选择是放一些&#34;探测&#34;代码中的语句。例如,如果您需要确认在单击添加到购物车时是否在Customer :: CartsController show动作中设置了class Customer::CartsController < ApplicationController before_action :authenticate_user! def show return unless current_user current_user.cart ||= Cart.find(session[:cart_id]) # if the cart has already been purchased, reset to a new cart if current_user.cart.purchased_at current_user.cart = Cart.create!(user_id: params[:id]) session[:cart_id] = current_user.cart.id end @cart = current_user.cart end end 值,您可以输入purchased_at之类的语句 在if语句的主体内。输出将显示在Rails服务器输出中,您可以在Web浏览器中与站点交互时在另一个窗口中观看。

  2. 首选选项是使用调试器。我推荐puts "purchased_at is set",您可以在此处找到并阅读:https://github.com/nixme/pry-debugger

  3. 您应该尝试使用这些技术中的任何一种来查明运行时期间发生的情况与您的代码应该完成的期望不符,或者什么会促进您期望作为用户的行为。最终,这通常会导致隔离特定区域的代码,使事情变得不合理,使问题更容易。

答案 1 :(得分:0)

我认为此代码在Customer::CartsController show action

中有误
  @cart = if current_user
    current_user.cart ||= Cart.find_by(session[:cart_id])
    session[:cart_id] = nil if current_user.cart.purchased_at
  end

总是会@cart == nil

我认为它应该像

  @cart = if current_user
    current_user.cart ||= Cart.find_by(session[:cart_id])
    session[:cart_id] = nil if current_user.cart.purchased_at
    current_user.cart
  end

也就是说,if语句的最后一部分需要返回将分配给@cart的对象

答案 2 :(得分:0)

以前在购物车上工作我有同样的问题,据我记得它来自坐在应用程序控制器中的current_cart方法

我最终将其更改为此

def current_cart
    @cart = Cart.find(session[:cart_id]) 
    rescue ActiveRecord::RecordNotFound
    @cart = Cart.create
    session[:cart_id] = @cart.id 
    @cart
end

也在@ cart.add _之前_我在我的lineitems控制器创建方法中调用了该方法

@cart = current_cart

修改1

这是我的lineitems创建方法我认为如果没有

,你会错过购物车的创建
@lineitem = Lineitem.new(lineitem_params)
@cart = current_cart
item = Item.find(lineitem_params[:item_id])
@lineitem = @cart.addItem(item.id,@lineitem.quantity)