10

由于 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在部署后重置所有 etag,因为视图可能在部署之间发生了变化。我认为这很好地涵盖了 etag,尽管我仍然很好奇何时会自动包含一些关于视图的标识符以及是否需要“some-idnetifier”?有时 current_user 和 flash 会为零会是一个问题吗?

现在在片段缓存静态内容的第二点上。我假设如果我这样做了:

cache "v1" do
  all my html
end

我必须记住在页面更改时始终更改缓存标识符,否则我的应用程序将提供陈旧的内容。有什么方法可以自动执行此操作,还是已经由 Rails 处理?最好只缓存上次更新视图的时间或一些聪明的东西,这样我就不必跟踪我的静态内容何时更改。

4

1 回答 1

10

您可以在没有模型的数据处设置 etag/last modified,查看文档:http ://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

因此,您可以执行以下操作:

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:https ://github.com/rails/actionpack-page_caching


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

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

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

于 2013-05-26T12:54:43.060 回答