我正在完成Agile Web Development with Rails
在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?或者是为了将来的使用而对destroy进行修改,例如当我们尝试从另一个视图中删除购物车时?如果后一种解释是正确的,我们是否需要始终将id存储在:session hash?
中感谢您的帮助。
答案 0 :(得分:2)
对于初学者来说,它可以防止恶意修改网址的人passing &cart_id=ID_TO_CART_I_DONT_OWN
。见https://www.owasp.org/index.php/Top_10_2010-A4。
你也可以通过从会话中获取购物车来保存自己的数据库查找[虽然默认情况下使用rails缓存的rails非常好]。关于它可能会失败,如果在您点击“删除购物车”按钮时记录不再存在会发生什么? Cart.find(params[:id])
将引发您未处理的异常,第二种方法将处理异常并安静地失败;这不一定总是好事。
答案 1 :(得分:0)
由于您正在处理Shopping Cart
等实时应用程序,因此很有可能两个或更多用户同时访问该应用程序并购买相同的产品。虽然params[:id]
对每个用户来说都是唯一的,但是任何用户都可以通过黑客恶意进入其他用户,这将导致严重的缺陷。
这样,您的应用程序为每个用户都有一个会话,您可以在其中存储将在该用户的请求之间保留的少量数据。管理每个用户的会话可以保持一致性,并且有一个很好的资源管理。这不会造成任何破坏。