如何在rails上禁止页面缓存

时间:2010-11-16 05:43:52

标签: ruby-on-rails ruby-on-rails-3

我正在设计一个购物车,有两个网页,

首先是结帐页面,第二个是order_success页面

如果用户使用webbrowser上的返回按钮,则在用户进入order_success页面后,它将返回结帐页面。

所以我想找到一些禁止让我们回去的方法,

在轨道上有什么办法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

  1. 清除购物车
  2. 将用户重定向到新操作
  3. 购买成功后,您应清除购物车,然后将用户重定向到新操作。

    在你的order_controller.rb

     def create
         @shopping_cart = nil
         redirect_to some_path
     end 
    

答案 1 :(得分:1)

  

“我知道这一点,但如果客户端有一些缓存,用户将使用返回按钮,   用户仍然可以看到一些东西&重新提交,这不是我所期望的“[那是什么意思?]

如果您想阻止用户重新提交相同的请求,您可以添加隐藏字段(只是随机的)并在处理完请求后将其存储在会话中:

if params[:token] == session[:used_token]
  render_already_processed_notice
  return
end
if @cart.save
  session[:used_token] = params[:token]
....

如果您在请求中使用购物车ID,那么您可以使用购物车模型的状态:

@cart = Cart.find(params[:id])
render_some_notice and return if @cart.done?
....
@cart.done = true
@cart.save

我个人不会创建checkout和order_success页面。我只想创建一个单页 - 购物车状态,根据模型状态,我只会显示不同的内容。

如果某些操作只能执行一次(例如关闭购物车或完成交易),则没有问题:render_something and return if @cart.already_closed?

在可以进行多次提交的页面上,但并不总是欢迎(例如将产品添加到购物车 - 用户可以添加两个相同的产品),您可以做两件事:

1)使用上面提到的令牌,它将检测用户何时按下F5,并询问他该动作是否真的应该进行两次,或者

2)只接受请求,但始终为用户提供“回滚”操作的方法(允许他从购物车中删除产品),并确保在最终验收之前验证购物车内容。