在Rails中过期/破坏Etag

时间:2012-10-16 05:26:00

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

在rails中进行HTTP缓存时,曾经使用过:
fresh_when etag:@ user,public:true

问题在于,如果您有机会获取页面的html,则缓存页面将不再有效。因此,我们需要一种方法来在每次更改内容时使页面/ etag无效。

一种方法是每次按部署时更改RAILS_CACHE_ID Etag busting on deployment。但是,这样做会导致所有etags,因为每个部署的所有页面都会过期。

我宁愿有一个解决方案,我可以为单个页面过期单个标签。

我可以用这样的版本生成我自己的etag: fresh_when etag:(@ user.updated_at.to_s +“V1”),public:true

但这并不像“Rails方式”。更优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

There's an update to this article具有相应的库,因此您只需在config中设置版本即可。请参阅https://github.com/n8/bust_rails_etags

上的自述文件

答案 1 :(得分:0)

如果您正在使用Capistrano或部署策略,其中Rails.root值在每个部署中发生更改,您可以将其添加到应用程序控制器:

class ApplicationController < ActionController::Base

  # This causes http request caching to expire when we deploy.
  # The app is deployed /mnt/code/releases/<timestamp>
  etag { $etag_cache_control_fragement ||= Rails.root.to_s.split("/").last }

参考此处:http://api.rubyonrails.org/v5.1/classes/ActionController/ConditionalGet/ClassMethods.html