the rails present not images asset javascript ruby-on-rails caching ruby-on-rails-3.1 asset-pipeline

javascript - present - Borre la caché de la cartera de activos de Rails



the asset is not present in the asset pipeline (5)

Pruebe también los rake assets:clobber . Esto restablecerá totalmente todo y eliminará todos los activos compilados. Además, a menudo necesito configurar el entorno antes de pasar a la producción yendo: RAILS_ENV=production rake assets:precompile .

Estoy comenzando un nuevo proyecto en Rails, y parece que el archivo de manifiesto de application.js está haciendo algo gracioso con los javascripts a los que hago referencia: ¿almacenan en caché esos archivos como parte de la cartera de activos?

Esto es lo que sucedió. Agregué un archivo javascript llamado jquery.autoresize.js a la carpeta vendors / assets / javascripts, y luego hice referencia al archivo en el manifiesto de application.js así:

//= require jquery.autoresize.js

Luego, inicié el servidor de los rieles. Pero después de navegar en mi aplicación, me di cuenta de que accidentalmente había agregado la versión incorrecta del archivo jquery.autoresize.js. Entonces, eliminé ese archivo y luego agregué la versión correcta a la carpeta vendors / assets / javascripts. Pero, para mi horror, cuando volví a cargar la página, todavía está cargando el antiguo archivo javascript.

Intenté vaciar el caché de mi navegador, luego salir y reiniciar el servidor de Rails, pero fue en vano. He pirateado una solución juntos simplemente cambiando el nombre de mi archivo javascript y haciendo referencia al nuevo nombre, que funcionó bien. Pero tiene que haber una mejor solución para esto.

¿La nueva canalización de activos almacena en caché los archivos a los que hace referencia de alguna manera? Si es así, ¿cómo puedo borrar ese caché? ¡Gracias por cualquier ayuda!


Rails borra automáticamente la memoria caché de un archivo individual cada vez que se editan los contenidos. Para borrar el caché de un solo archivo, simplemente abra el archivo, edite una línea de código y vuelva a guardarlo. Rails borrará el caché de ese archivo y el navegador cargará el nuevo archivo la próxima vez que cargue la página.

La razón por la que jquery.autoresize.js usaba la versión antigua en caché del archivo era porque la versión anterior se había eliminado y luego la nueva versión se copiaba y pegaba con el mismo nombre en la misma carpeta. Debido a que el archivo nunca se editó, Rails continuó utilizando el archivo anterior que estaba en la memoria caché.

Esto se debe a que el inventario de activos utiliza huellas digitales para la memoria caché.

La toma de huellas dactilares es una técnica que hace que el nombre de un archivo dependa del contenido del archivo. Cuando el contenido del archivo cambia, el nombre del archivo también se cambia. Para contenido que es estático o que se cambia con poca frecuencia, esto proporciona una manera fácil de saber si dos versiones de un archivo son idénticas, incluso entre diferentes servidores o fechas de implementación.

Cuando un nombre de archivo es único y se basa en su contenido, los encabezados HTTP se pueden configurar para alentar los cachés en todas partes (ya sea en CDN, en ISP, en equipos de red o en navegadores web) para conservar su propia copia del contenido. Cuando el contenido se actualiza, la huella digital cambiará. Esto hará que los clientes remotos soliciten una nueva copia del contenido. Esto se conoce generalmente como prevención de memoria caché.

La técnica que utiliza Rails para la toma de huellas digitales es insertar un hash del contenido en el nombre, generalmente al final. Por ejemplo, un archivo CSS global.css podría renombrarse con un resumen MD5 de sus contenidos:

global-908e25f4bf641868d8683022a5b62f54.css

Por lo tanto, si elimina un archivo al que hace referencia en el manifiesto y luego copia un nuevo archivo con el mismo nombre, la prevención de caché nunca se produce. Cuando edita el archivo, las huellas dactilares se activan y se genera un nuevo hash para el nombre del archivo. Esto rompe el caché para ese archivo .

Para la historia completa, mira ¿Qué es la huella dactilar y por qué debería importarme? .


Supongo que estamos hablando del entorno de producción.

Cuando cambie cualquiera de sus JavaScript o hojas de estilo en el entorno de producción, debe ejecutar rake assets:precompile ; esta tarea compila y comprime los diversos archivos .js y .css y crea los archivos application.js y application.css que cargan sus vistas.

Es posible que si reemplazó jquery.autoresize.js con una versión con una marca de tiempo anterior , el paso de precompilación podría saltearse, pensando que la versión compilada está actualizada. Puede evitar eso ejecutando rake assets:clean primero, forzándolo a reconstruir todo en el directorio public/assets desde cero.


Utilizo config.assets.version = ''1.01019'' en mi application.rb para reventar todo el caché. Cuando deseo enviar una versión completa, incremente la versión y eso funciona. Esto se ocupa de los casos extremos en los que Rails no se recompila como activo por el motivo que sea.


rake tmp:clear hizo el truco para mí, estoy usando less-rails.