2012-05-04 29 views
21

我正在使用Heroku for Rails 3.1应用程序的Memcached。我有一个错误,并显示错误的东西 - 缓存的参数不正确。手动清除Rails中的片段缓存

我有这样的:

<% cache("foo_header_cache_#{@user.id}") do %> 

我删除片段缓存,并被推到Heroku的和坏数据就走开了。

然后我把它改为:

<% cache("foo_header_cache_#{@foo.id}") do %> 

然而,当我纠正了参数,从@user到@foo,老[不正确]缓存的版本再次显示(而不是用正确的数据刷新)。

我该如何手动过期,否则就摆脱了显示的这些不良数据?

回答

39

我最终通过进入轨道控制台和使用命令手工清除整个缓存:

Rails.cache.clear 
+3

John Kloian的答案允许你过期一个片段。如果您的网站获得相当数量的流量并依赖于缓存,则在缓存加温时,过期到期可能会导致非常缓慢的页面加载或超时错误。 –

20

来自导轨控制台:

Rails.cache.delete 'FRAGMENT-NAME' 
+4

这是现在正确的答案。接受的是用霰弹枪杀死苍蝇。 –

7

从控制台:

您可以运行此(即。如果你知道ID是“1”)

ActionController::Base.new.expire_fragment("foo_header_cache_1") 

要使用Rails.cache.delete你需要知道的片段名。对你来说,这将是

Rails.cache.delete("views/foo_header_cache_1") # Just add 'views/' to the front of the string 

如果你有使用的对象,如基于阵列的缓存键:

cache([:foo_header_cache, @user]) 

然后你就可以得到该片段的名称,像这样

ActionController::Base.new.fragment_cache_key([:foo_header_cache, @user]) 

该名称包括从任何对象(到yyyymmddhhmmss)的idupdated_at时间。它会像“views/foo_header_cache/users/1-20160901021000”

或者只是使用数组清除它。

ActionController::Base.new.expire_fragment([:foo_header_cache, @user])