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?

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)

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.


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

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é.


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.


¿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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.