我一直在尝试使用 Rails 的缓存功能,但我无法使某些缓存片段过期,尽管它们似乎已过期。使用 Rails 教程网站中指出的“Russian Doll Caching”,我正在使用此配置
<% 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%>
我使release_controller.rb 控制器中的外部缓存过期,其中我使用expire_fragment("all_available_releases") 来使片段过期。我在控制器的每个更新、删除或添加条目的方法中使用它。
这是 WEBrick 的日志,其中虽然过期片段被注册,但 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)
我什至尝试使用Rails.cache.delete("all_available_releases")
它也不起作用。
如果我删除<%cache "all_available_releases"%>
(和一个<%end%>
)从我的 html.erb 来看,缓存工作正常,并且会在应该过期的时候过期。
我认为问题在于,当您在视图中缓存片段时,缓存摘要将被添加到缓存键中(views/all_available_releases/41cb0a928326986f35f41c52bb3d8352),但expire_fragment没有使用摘要(views/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%>
缓存摘要仅用于自动缓存过期。如果您需要手动使缓存键过期,则不能使用缓存摘要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)