如何在Rails中重定向到新呈现的页面(未缓存)?

时间:2014-06-10 11:00:25

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

在Rails 3(使用Chrome)中,我设置了一个闪存,调用redirect_to,然后将浏览器发送回用户之前所在的页面。

但是,Chrome无法呈现此页面;相反,Chrome从缓存中获取它。这意味着,例如,不渲染闪光灯。

我可以在URL中添加一个随机参数,以确保不使用缓存,但这很笨拙。

如何确保重定向的页面重新呈现?

1 个答案:

答案 0 :(得分:1)

我可以通过以下几种方式来做到这一点:meta http-equiv标签或http标头。

方法A)meta http-equiv

将以下内容添加到模板的head部分。

<% if @prevent_caching %>
  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
  <meta http-equiv="Pragma" content="no-cache"/>
  <meta http-equiv="Expires" content="0"/>
<% end %>

然后,在任何控制器操作中,您可以在呈现页面之前说出@prevent_caching = true

这看起来有点笨拙,我相信meta http-equiv可能不可靠。因此...

方法B)http标头。 这是告诉浏览器不要缓存的更直接,更可靠的方法: 见How to control web page caching, across all browsers?

我会将它们放在ApplicationController中的受保护方法中,这将允许您从任何其他控制器调用它(因为它们都从此继承)

#in app/controllers/application.rb
protected
def prevent_browser_caching
  response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' # HTTP 1.1.
  response.headers['Pragma'] = 'no-cache' # HTTP 1.0.
  response.headers['Expires'] = '0' # Proxies.
end

然后,除了你调用方法而不是设置变量之外,它就像之前一样。

#in the controller where you don't want the response to be cached
prevent_browser_caching