我最近关注敏捷书到迭代E3。在这次迭代中,我可以用正确的视图“成功”清空购物车并按照教程显示通过测试。但是,在rails'console中,当我检查Cart.all
时,相应的购物车仍然存在;当我强迫http://localhost:3000/carts/1;我看到以前所有选定的订单项仍然存在。我想当调用destroy时,应该从数据库中销毁购物车和相应的行项目,但似乎没有。我在哪里误会了?有人可以解释为什么这个开心了吗?我将源代码推送到github:https://github.com/WeiliangXing/depot-rails.git
另外我发现session [:card_id]等于nil,因为我在LineItemController中使用set_cart方法设置current_cart会话,所以它应该有一些东西。有人可以帮我找出原因吗?
答案 0 :(得分:1)
这是一个非常具体的问题,我想,如果你只是继续阅读教程,你可能自己找到了答案:)
您的购物车仍然存在的原因是因为它没有被删除。 有一个警卫说“if @ cart.id == session [:id]”,它永远不会返回true,因为session [:id]是nil。
在你的应用中的某个时刻,你必须设置会话[:id],我认为,这应该在def create; ...; end
,但我没有阅读教程,所以我不想指出你在一个错误的方向。
您的测试仍然存在的原因是:您在测试中设置了会话[:id],但从未在您的实际应用中设置。
所以,对你来说更有趣的可能是如何调试rails应用程序:
'puts' is very usefull它会在你的控制台中写东西。 所以,我这样做了:
# DELETE /carts/1
# DELETE /carts/1.json
def destroy
puts @cart.id, session[:cart_id].inspect, @cart.id.to_s == session[:cart_id]
@cart.destroy if @cart.id == session[:cart_id]
session[:cart_id] = nil
respond_to do |format|
f ormat.html { redirect_to store_url, notice: 'Your cart is currently empty.' }
format.json { head :no_content }
end
end
这给了我输出
1
nil
false
使用puts来找出你的应用程序正在做什么,并使用.inspect来确保写出“nil”之类的内容而不仅仅是空白空间。
快乐编码:)
答案 1 :(得分:0)
我有同样的问题(。在我的情况下,由@Ninigi提供的 puts 输出下一个:
11
11
false
然后我从 @ cart.id.to_s == session [:cart_id] 中删除了 to_s 方法并获取
11
11
true
但问题并没有得到解决。而且我认为
@cart.destroy if @cart.id == session[:cart_id]
是递归,我已将 destroy 方法更改为 delete 。现在这一行看起来像:
@cart.delete if @cart.id == session[:cart_id]
魔法做了自己的工作)现在我们可以在没有错误的情况下销毁购物车。
我希望它可以帮助任何人。
谢谢!