我有一个电子商务解决方案,当订单完成时,我希望用户能够去购物车并看到它是空的。以前我摧毁了购物车,但是没有建议,所以根据一些建议我添加了一个列到购物车
:active, :boolean, :default true
我的购物车控制器看起来像这样
def show
@cart = Cart.find_by_id(session[:cart_id])
end
# GET /carts/new
def new
@cart = Cart.create
session[:cart_id] = @cart.id
@cart
redirect_to @cart
end
我的应用程序控制器中有一个方法,用于创建购物车。
def current_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
订单完成后,我将:active列从true更改为false。我怎么能这样做,如果current_cart.active?是假的,它会创造一个新车?
我已经尝试了
def current_cart
if Cart.find(session[:cart_id]).active? ==false
cart = Cart.create
session[:cart_id] = cart.id
end
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
但我似乎有两辆车一次工作..
更新
尝试
def current_cart
if Cart.find(session[:cart_id]).active? ==false
reset_session
else
Cart.find(session[:cart_id])
end
无济于事..
答案 0 :(得分:1)
如果Cart
返回的代码未激活,则您尝试的代码不会返回Cart.find
对象 - 它会返回cart.id
。最简单的解决方法是返回创建的购物车(就像在rescue
子句中一样):
def current_cart
cart = Cart.find(session[:cart_id])
unless cart.active?
cart = Cart.create
session[:cart_id] = cart.id
end
cart
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
你也应该干它 - 就像:
def current_cart
begin
cart = Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = nil
end
unless cart && cart.active?
cart = Cart.create
session[:cart_id] = cart.id
end
cart
end
如果您不想在新方案中实际创建购物车,请使用new
代替create
:
def current_cart
cart = Cart.find(session[:cart_id])
unless cart.active?
cart = Cart.new
end
cart
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end