Ruby on rails Rails 4.0过期\u片段/缓存过期不起作用

Ruby on rails Rails 4.0过期\u片段/缓存过期不起作用,ruby-on-rails,ruby,caching,cache-expiration,Ruby On Rails,Ruby,Caching,Cache Expiration,我一直在尝试使用rails的缓存功能,但我无法使某些缓存片段过期,尽管它们似乎已经过期。使用rails教程站点中指出的“俄罗斯玩偶缓存”,我使用的是这种配置 <% cache "all_available_releases" do %> <% @releases.each do |release| %> <% cache(release) do %> <html code with> <%ruby code @release

我一直在尝试使用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%>    
我甚至尝试过使用
Rails.cache.delete(“所有可用的发布”)
,但也不起作用


如果我从我的html.erb中删除
(和一个
),缓存工作正常,并在应该的时候过期。

我认为问题在于,当您在视图中缓存片段时,缓存摘要被添加到缓存键(views/all\u available\u releases/41CB0A928326986F35F411C52BB3D8352),但是expire\u片段没有使用摘要(视图/所有可用发布)

如果将
skip\u 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%>


缓存摘要仅用于自动缓存过期。如果需要手动使缓存密钥过期,则不能使用缓存摘要。

Jbuilder不支持跳过摘要。在经历了许多失败的方法之后,我决定在这里分享我的答案,因为这与rails的观点高度相关,但与上面的问题不同

这里有一个相关的Q/issue,DHH本质上告诉这个家伙他不能显式地终止fragment_缓存。 一切都不是正方形的,所以这里有一个解决方法:

class MenuController
  def index
    json = Rails.cache.fetch('clients') do
      @items = Menu.all
      render_to_string( template: 'menu/index', locals: {items: @items})
    end
    render json: json
  end
end
然后你可以在任何地方明确地终止它,比如在一个观察者中

class MenuCacheObserver < ActiveRecord::Observer
  observe :menu, :menuitem, :menusubnavigation

  def after_save obj
    Rails.cache.delete(:clients)
  end
end
class MenuCacheObserver

在一些情况下,这可能是有意义的。一般来说,在大多数情况下,您应该在缓存输入中使用对象,比如
json.cache@my_对象不包装jbuilder视图。这样,当对象上的更新时,它将失效

我自己也遇到了这个问题,我处理这个问题的方法是通过正则表达式。这可能不是最优雅的解决方案,但效果很好

ActionController::Base.new.expire_fragment(%r{offer_#{@offer.id}/*})

添加skip_摘要要好得多。

在Rails 5中,我采取了以下步骤来破坏缓存,而无需求助于
skip_摘要:true
。我们的问题是,更改I18n字符串的值不会反映在计算的缓存摘要中,因此缓存不会自动被破坏

以下是定义缓存块的视图:

/ views/layouts/_footer.html.slim
- cache :footer do
  span= t('shared.footer')
然后在rails控制台中运行:

fragment = ActionController::Base.new.view_context.cache_fragment_name(:footer, virtual_path: 'layouts/_footer.html.slim')
ActionController::Base.new.expire_fragment(fragment)

cache\u fragment\u name
将根据
virtual\u path
关键字参数计算摘要。

这给我带来了很多麻烦。谢谢谢谢,这是哪里记录的?找到了它的参考资料谢谢--我第一次尝试缓存,我被困在这30分钟了!!刚刚遇到同样的问题,完美修复,谢谢!看起来jbuilder现在支持skip_digest(我使用的是2.4.0)-下面的代码对我很有用
json.cache!['v1',my_obj.cache_key],skip_digest:true,expires_in:6.hours do json.partial!'path/to/my/partial',obj:my_obj end
不,我正在使用jbuilder(2.6.1)
,但是skip_digest不起作用
fragment = ActionController::Base.new.view_context.cache_fragment_name(:footer, virtual_path: 'layouts/_footer.html.slim')
ActionController::Base.new.expire_fragment(fragment)