Rails中的静态操作的缓存/ Etag 4

时间:2013-05-23 06:01:53

标签: ruby-on-rails caching ruby-on-rails-4 etag

由于Rails 4删除了页面缓存和动作缓存,我想知道什么是Rails 4缓存没有变量且在视图中只有html的动作?我应该在视图中片段缓存静态html吗?当没有模型将其设置为过期时,如何设置etag / fresh_when?我很难找到一个示例或约定来缓存应该是最容易缓存的页面。

需要注意的是,虽然视图完全是静态的,但页面仍然具有动态导航栏,具体取决于用户是否已登录。你如何处理这样的静态页面,而不采取行动缓存,因为它被删除,并且约定已经设置为不使用gem版本?

示例:

class HomesController < ApplicationController    
  def index
  end
end

舍/ index.html.erb

<div>A bunch of normal html tags with no erb</div>

修改 根据@ severin的回答和我自己的研究,这是我到目前为止所提出的。

class HomesController < ApplicationController    
  def index
    fresh_when(["some-identifier", current_user, flash])
  end
end

此外,我正在使用https://github.com/n8/bust_rails_etags重置部署后的所有etags,因为视图可能在部署之间发生了变化。我认为这很好地涵盖了etag,虽然我仍然很好奇是否会自动包含一些关于视图的标识符以及是否需要“some-idnetifier”?是否会出现问题,有时current_user和flash会为零?

现在关于片段缓存静态内容的第二点。我假设我做了:

cache "v1" do
  all my html
end

我必须记住在更改页面时始终更改缓存标识符,否则我的应用程序将提供过时的内容。任何方式自动化这个或已经由rails处理?最后一次缓存视图更新或者更聪明的事情会很好,所以我不必跟踪我的静态内容何时被更改。

1 个答案:

答案 0 :(得分:10)

您可以在没有型号的情况下设置etag / last修改数据,请查看文档:{​​{3}}

所以你可以这样做:

def index
  fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true)
  render
end

注意:您不需要提供etag和最后一次修改时间戳,您只需提供一个etag或仅在时间戳上修改最后一次。

除此之外,我还将片段缓存整个视图内容。

或者您可以使用官方插件/ gem继续使用action- / page_caching:http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when


关于问题第二部分的一些补充:

Rails将RAILS_CACHE_ID环境变量的内容添加到其所有缓存键(示例中的etag和片段缓存键)。 bust_rails_etags gem添加了另一个仅影响etags的环境变量...因此,在您的情况下,您可以删除bust_rails_etags gem并在所有部署中更新RAILS_CACHE_ID环境变量。

您甚至可以通过在 config / environment.rb 中添加类似内容来自动更新RAILS_CACHE_ID环境变量:

code_revision = # ... some piece of code that gets the current revision.
                # I'm using git and I use the following (crude) piece of
                # to get the current revision:
                # code_revision = `git log --pretty=format:%h -n1`.strip
ENV['RAILS_CACHE_ID'] = code_revision

这样,当前代码修订版总是添加到所有缓存键中。