23

我将 Memcached 与 Heroku 一起用于 Rails 3.1 应用程序。我有一个错误并且显示了错误的东西 - 缓存的参数不正确。

我有这个:

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

我删除了片段缓存并推送到 Heroku,坏数据就消失了。

然后我将其更改为:

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

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

如何手动使此过期,或者以其他方式摆脱显示的这些不良数据?

4

4 回答 4

42

我最终通过进入 rails 控制台并使用以下命令手动清除了整个缓存:

Rails.cache.clear
于 2012-05-05T07:13:32.993 回答
26

从 rails 控制台:

Rails.cache.delete 'FRAGMENT-NAME'
于 2014-09-01T16:08:15.777 回答
21

这个给你:

<% ActionController::Base.new.expire_fragment("foo_header_cache_#{@user.id}") %>

参考:
-如何从 Rails 观察者/模型调用 expire_fragment?

于 2013-03-16T10:00:34.323 回答
11

从控制台:

您可以运行它(即,如果您知道 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])

该名称包括来自任何对象的时间idupdated_at时间(到 yyyymmddhhmmss)。类似于“views/foo_header_cache/users/1-20160901021000”

或者简单地使用数组清除它。

ActionController::Base.new.expire_fragment([:foo_header_cache, @user])
于 2016-09-01T21:59:19.940 回答