我有一个资源丰富的控制器,带有自定义操作。行动很重,所以我正在努力缓存它:
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
的所有选择。
有没有办法清除所有匹配某个正则表达式的动作缓存,或者来自特定控制器的所有动作缓存?
答案 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
参数,并在用户按下“胸围缓存”按钮时递增它...