在使用Rails 4的敏捷Web开发中,购物车是否被销毁?

时间:2015-07-08 14:59:17

标签: ruby-on-rails

我最近关注敏捷书到迭代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会话,所以它应该有一些东西。有人可以帮我找出原因吗?

2 个答案:

答案 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]

魔法做了自己的工作)现在我们可以在没有错误的情况下销毁购物车。

我希望它可以帮助任何人。

谢谢!