我为一位客户提供了一个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
任何帮助将不胜感激。提前谢谢!
答案 0 :(得分:1)
如果没有看到完整的代码,很难确切知道这里发生了什么。例如,问题主要是在尝试将产品添加到购物车时发生的错误,但未显示add_product
方法的定义。
我可以提供一些应该有用的建议。首先,show
的{{1}}方法很难遵循。我已经重构它以删除不必要的嵌套if语句,并减少条件数。
Customer::CartsController
其次,在处理这样的错误时,您应该发现自己有一个更具体的问题(如果不是您的问题的答案)。为了得出这样一个特定问题,您需要进行调试以找出问题所在。您可以通过以下几种方式完成此操作:
最简单的选择是放一些&#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浏览器中与站点交互时在另一个窗口中观看。
首选选项是使用调试器。我推荐puts "purchased_at is set"
,您可以在此处找到并阅读:https://github.com/nixme/pry-debugger。
您应该尝试使用这些技术中的任何一种来查明运行时期间发生的情况与您的代码应该完成的期望不符,或者什么会促进您期望作为用户的行为。最终,这通常会导致隔离特定区域的代码,使事情变得不合理,使问题更容易。
答案 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)