0

我正在使用 Rails 进行敏捷 Web 开发

在 E3 部分中,它说要替换以下方法:

def destroy
  @cart = Cart.find(params[:id])
  @cart.destroy

def destroy
  @cart = current_cart
  @cart.destroy  

在哪里

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

我的问题是,使用第二种方法比第一种方法有什么优势?我看不到第二个会失败的任何情况?这是从以下位置调用方法:

<%= button_to 'Delete Cart', method: :destroy %>

从购物车视图中。它不是总是隐含地传递正确的cart_id吗?或者这个修改是为了将来使用而销毁,例如当我们试图从另一个视图中删除购物车时?如果后一种解释是正确的,我们是否需要始终将 id 存储在 :session 哈希中?

谢谢你的帮助。

4

2 回答 2

2

对于初学者来说,它提供了一些保护,防止有人恶意修改 url 和passing &cart_id=ID_TO_CART_I_DONT_OWN. 请参阅https://www.owasp.org/index.php/Top_10_2010-A4

您还可以通过从会话中获取购物车来为自己节省数据库查找[尽管默认情况下,rails 非常适合使用 db 缓存]。关于它可能会失败,如果在您点击“删除购物车”按钮时记录不再存在怎么办?Cart.find(params[:id])将引发您未处理的异常,第二种方法将处理异常并安静地失败;这不一定总是一件好事。

于 2013-01-18T13:22:32.947 回答
0

由于您正在处理实时应用程序,例如Shopping Cart,很有可能两个或多个用户同时访问该应用程序并购买相同的产品。虽然params[:id]每个用户都是唯一的,但任何用户都可以通过黑客恶意进入其他用户,这将导致严重的缺陷。

这样,您的应用程序为每个用户创建了一个会话,您可以在其中存储少量数据,这些数据将在该用户的请求之间持久化。为每个用户管理会话可以保持一致性,并且有一个很好的资源管理。这不会造成任何破坏。

于 2013-01-18T13:23:02.580 回答