Ruby on Rails: borra una página en caché

81

Tengo una aplicación RoR (ruby v1.8.7; rails v2.3.5) que almacena en caché una página en el entorno de desarrollo. Esto no sería un gran problema, pero los aelementos de la página en caché son incorrectos.

No he realizado ningún cambio en el archivo development.rb y no he agregado a sabiendas ningún comando de almacenamiento en caché a los controladores.

Intenté borrar la cookie del navegador (Firefox 3.5 en OSX) y las cachés de página para este sitio (localhost). También reinicié Mongrel. Nada parece ayudar.

¿Qué me estoy perdiendo?

Craig
fuente

Respuestas:

125

Esta línea en development.rb asegura que el almacenamiento en caché no esté sucediendo.

config.action_controller.perform_caching             = false

Puede borrar la caché de Rails con

Rails.cache.clear

Dicho esto, no estoy convencido de que se trate de un problema de almacenamiento en caché. ¿Está realizando cambios en la página y no los ve reflejados? ¿Quizás no estás viendo la versión en vivo de esa página? Lo he hecho una vez (rubor).

Actualizar:

Puede llamar a ese comando desde la consola. ¿Está seguro de que está ejecutando la aplicación en desarrollo?

La única alternativa es que la página que está intentando representar no es la página que se está representando.

Si observa la salida del servidor, debería poder ver el comando de renderizado cuando la página se renderiza de manera similar a esto:

Rendered shared_partials/_latest_featured_video (31.9ms)
Rendered shared_partials/_s_invite_friends (2.9ms)
Rendered layouts/_sidebar (2002.1ms)
Rendered layouts/_footer (2.8ms)
Rendered layouts/_busy_indicator (0.6ms)
Una tarta
fuente
Esa línea está presente en el archivo development.rb. ¿Dónde agrego ese comando? Si. Hice cambios en la página que deberían haberse mostrado si la página estaba "activa". Así es como descubrí el problema del almacenamiento en caché.
craig
Parece haber sido un error idiota de mi parte. rubor Gracias por su tiempo y ayuda. Aprendí mucho.
craig
No hay problema. Me encantaría saber cuál fue el problema, estas cosas siempre son bastante oscuras, sobre todo cuando estás cometiendo un error idiota, me imagino que estoy obligado a cometer el mismo en algún momento pronto :)
Apie
1
He anidado rutas para dos modelos relacionados. En una página, utilizo edit_parent_child_path en el link_to. Desafortunadamente, omití la referencia de los padres; era edit_parent_child_path (hijo), necesitaba ser edit_parent_child_path (@ parent, child).
craig
"¿Quizás no estás mirando la versión en vivo de esa página? Lo he hecho una vez (rubor)". LOL, esto me acaba de pasar jaja
Robert Vunabandi
113

rake tmp:cache:clear podría ser lo que estás buscando.

Karen
fuente
1
Si el ambiente es algo distinto de desarrollo, entonces tendrá que agregar (por ejemplo, puesta en escena) - RAILS_ENV=staging bundle exec rake tmp:cache:clearde lo contrario supongo que no va a funcionar
Poorva
esto solo eliminará los archivos del directorio tmp / cache. no borrará los datos del almacén de caché. stackoverflow.com/questions/19017983/…
Oshan Wisumperuma
25

Pude resolver este problema limpiando mi caché de activos:

$ rake assets:clean
Dan
fuente
4

Busque una versión estática de su página en / public y elimínela si está allí. Cuando Rails 3.x almacena páginas en caché, deja una versión estática en su carpeta pública y la carga cuando los usuarios visitan su sitio. Esto permanecerá incluso después de que borre su caché.

David Harbage
fuente
En Rails 4, los elementos de caché ubicados en el /tmp/cache/directorio.
Ivan Chau
Esto funcionó para mí. Seguí obteniendo una página de renderización que estaba usando para probar un código nuevo. La consola del servidor no informaba de ninguna página nueva que estaba solicitando que mostrara el mismo texto. Limpié mi caché pensando que ese era el problema, pero eso no ayudó. Encontré la página en la carpeta pública, la eliminé y ahora funciona correctamente.
Reimus Klinsman
2

Si está haciendo almacenamiento en caché de fragmentos , puede romper manualmente el caché actualizando su clave de caché, así:

Versión 1

<% cache ['cool_name_for_cache_key', 'v1'] do %>

Versión 2

<% cache ['cool_name_for_cache_key', 'v2'] do %>

O puede hacer que el caché se restablezca automáticamente en función del estado de un objeto no estático, como un objeto ActiveRecord, así:

<% cache @user_object do %>

Con este método ^, cada vez que se actualiza el objeto de usuario, la caché se restablecerá automáticamente.

jeffdill2
fuente
¿Qué tal si desea que se restablezca automáticamente después de los cambios solo para la caché de fragmentos específicos?
Astm
@Astm, ahí es donde usaría la última opción: tener un objeto AR como parte de su clave de caché. Cuando updated_atse modifica, el objeto AR ya no coincidirá con la clave de caché, lo que provocará que el fragmento se vuelva a almacenar.
jeffdill2
Encontré una manera fácil de borrar el caché automáticamente si se produce algún cambio utilizando la sintaxis <% cache (['User_Cache', user_object], expires_in: 1.hour) do%> si hay algún cambio en el user_object, se actualizará automáticamente el caché
Astm
1
@Astm correcto, esa es la última opción que mencioné usando un objeto AR como parte de la clave de caché.
jeffdill2
1

Formas más esotéricas:

Rails.cache.delete_matched("*")

Para Redis:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
Николай Агеев
fuente