使控制器上的所有缓存失效

时间:2010-12-01 23:54:30

标签: caching ruby-on-rails-3

我有一个资源丰富的控制器,带有自定义操作。行动很重,所以我正在努力缓存它:

class MyController < ApplicationController
  caches_action :walk_to_mordor

  # GET /my/:id/walk_to_mordor/:direction
  def walk_to_mordor
    # srz bzns
  end
end

它非常好用,缓存完成,页面现在很快。但是,我希望允许用户通过单击页面上的链接来“破坏”缓存。起初我试过了:

def bust_cache
  expire_action :action => :walk_to_mordor
end

Rails抱怨没有路线符合我的行动。可能是因为参数。嗯,让我们把它给他:

def bust_cache
  MyEntities.all.each do |e|
    expire_action walk_to_mordor_path(e, ??)
  end
end

问题,我无法确定:direction的所有选择。

有没有办法清除所有匹配某个正则表达式的动作缓存,或者来自特定控制器的所有动作缓存?

1 个答案:

答案 0 :(得分:2)

这个秘密被称为expire_fragment

  

expire_fragment(key,options = nil)

     

从缓存中删除片段。

     

键可以采用以下三种形式之一:

     
      
  • 字符串 - 这通常采用路径的形式,例如“pages / 45 / notes”。

  •   
  • 哈希 - 被视为对url_for的隐式调用,例如{:controller => "pages", :action => "notes", :id => 45}

  •   
  • Regexp - 将删除任何匹配的片段,因此%r{pages/d*/notes}可能会删除所有注释。确保您不在正则表达式(^$)中使用锚点,因为匹配的实际文件名看起来像./cache/filename/path.cache。注意:只有可以遍历所有键的缓存支持Regexp到期(与memcached不同)。

  •   

http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html#method-i-expire_fragment

可悲的是,它不适用于memcached(如果我决定使用它)。要避免在那个环境中缓存,要聪明得多。也许在请求中添加serial参数,并在用户按下“胸围缓存”按钮时递增它...