Rails 4.0 expire_fragment/cache expiration无法正常工作

Mak*_*dis 28 ruby caching ruby-on-rails cache-expiration

我一直在尝试使用rails的缓存功能,但我无法使一些缓存片段过期,尽管它们似乎已过期.使用rails教程网站中指出的"俄罗斯娃娃缓存",我正在使用此配置

<% cache "all_available_releases" do %>
 <% @releases.each do |release| %>
  <% cache(release) do %>
   <html code with>
   <%ruby code @release.name blah blah blah%>
  <%end%>
 <%end%>
<%end%>    
Run Code Online (Sandbox Code Playgroud)

我使用release_controller.rb控制器中的外部缓存到期,我使用expire_fragment("all_available_releases")来使片段到期.我在控制器的每个更新或删除或添加条目的方法中使用它.

这是WEBrick的日志,虽然expire片段已经注册,但5行之后读取并使用过期片段,而不应该.此示例是在销毁调用之后.

Processing by ReleasesController#destroy as HTML
  Parameters: {"authenticity_token"=>"***/***/********************+********=", "id"=>"2"}
  Release Load (0.1ms)  SELECT "releases".* FROM "releases" WHERE "releases"."id" = ? LIMIT 1  [["id", "2"]]
   (0.1ms)  begin transaction
  SQL (2.0ms)  DELETE FROM "releases" WHERE "releases"."id" = ?  [["id", 2]]
   (148.0ms)  commit transaction
Expire fragment views/all_available_releases (0.1ms)
Redirected to http://127.0.0.1:3000/releases
Completed 302 Found in 180ms (ActiveRecord: 150.2ms)


Started GET "/releases" for 127.0.0.1 at 2013-07-03 13:09:51 +0300
Processing by ReleasesController#index as HTML
Read fragment views/all_available_releases/41cb0a928326986f35f41c52bb3d8352 (0.1ms)
  Rendered releases/index.html.erb within layouts/application (0.6ms)
Completed 200 OK in 5ms (Views: 4.0ms | ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)

我甚至尝试过使用Rails.cache.delete("all_available_releases")它也没用.

如果我从我的html.erb中删除<%cache "all_available_releases"%>(和一个<%end%>),缓存工作正常,并在任何时候到期.

小智 60

我认为问题是,当你在你看来缓存片段缓存摘要被添加到缓存键(视图/ all_available_releases/41cb0a928326986f35f41c52bb3d8352),但expire_fragment未使用摘要(视图/ all_available_releases).

如果skip_digest: true在视图中添加缓存调用,则应阻止使用摘要.

<% cache "all_available_releases", skip_digest: true do %>
 <% @releases.each do |release| %>
  <% cache(release) do %>
   <html code with>
   <%ruby code @release.name blah blah blah%>
  <%end%>
 <%end%>
<%end%>
Run Code Online (Sandbox Code Playgroud)

缓存摘要仅用于自动缓存过期.如果您需要手动使缓存密钥到期,则无法使用缓存摘要.

  • 同样,这需要在文档中更清楚. (6认同)
  • 谢谢,这在哪里记录? (2认同)