2012-05-04 7 views
21

Estoy utilizando Memcached con Heroku para la aplicación Rails 3.1. Tuve un error y se muestran las cosas incorrectas, los parámetros eran incorrectos para el caché.Limpiar manualmente la memoria caché de fragmentos en Rails

Tenía esta:

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

Quité el almacenamiento en caché de fragmentos y empujó a Heroku y los malos datos fue.

Y luego lo cambié a:

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

Sin embargo, cuando he corregido los parámetros, desde @user a @foo, la vieja versión [incorrecta] caché mostraron de nuevo (en lugar de actualizar con los datos correctos)

¿Cómo puedo caducar esto manualmente, o de otra forma deshacerme de esta información incorrecta que se muestra?

Respuesta

39

terminé limpiando manualmente toda la memoria caché por entrar en la consola de rieles y utilizando el comando:

Rails.cache.clear 
+3

La respuesta de John Kloian le permite caducar un único fragmento. Si tiene un sitio que obtiene una buena cantidad de tráfico y se basa en el almacenamiento en caché, caducar todo podría resultar en cargas de página muy lentas o errores de tiempo de espera a medida que se calienta el caché. –

20

Desde la consola de rieles:

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

Esta es ahora la respuesta correcta. El aceptado está usando una escopeta para matar una mosca. –

7

Desde la consola:

Puede ejecutar este (es decir. si se conoce el ID es '1')

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

Para utilizar Rails.cache.delete lo que necesita saber el nombre del fragmento. En su caso, sería

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

Si usted tiene una clave de caché basada en la matriz utilizando objetos, tales como:

cache([:foo_header_cache, @user]) 

A continuación, se puede obtener el nombre del fragmento al igual que

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

El nombre incluye el id y updated_at tiempo desde cualquier objeto (al aaaammddhhmmss). Sería algo así como "views/foo_header_cache/users/1-20160901021000"

O simplemente aclárelo usando la matriz.

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