2009-09-08 8 views
10

Así que el tiempo de estampación de rieles es excelente. Lo estoy usando para agregar encabezados de caducidad a todos los archivos que terminan en la marca de tiempo de 10 dígitos. Sin embargo, la mayoría de mis imágenes están referenciadas en mi CSS. ¿Alguien ha encontrado algún método que permita agregar marcas de tiempo a las imágenes con referencia a CSS, o alguna regla de reescribir funky que logre esto? Me encantaría que TODAS las imágenes de mi sitio, tanto en línea como en CSS, tengan esta marca de tiempo para que pueda indicarle al navegador que las guarde en caché, pero actualícelas cada vez que cambie el archivo.Rieles marcas de tiempo en imágenes en CSS

No pude encontrar nada en la red con respecto a esto y no puedo creer que este no sea un tema discutido con más frecuencia.

No creo que mi configuración tendrá importancia debido a que la fecha de expiración fijada real de esperar a pasar la misma manera, en base a la marca de tiempo de 10 dígitos, pero estoy usando Apache para servir a todo el contenido estático si lo que importa

+0

Vea mi respuesta a continuación, creo que la mejor solución ahora es usar Jammit, para el empaquetado que lo admite – brad

Respuesta

4

Se puede añadir la marca de tiempo real de cada archivo de imagen por conseguir el tiempo de modificación del archivo así:

source.gsub!(/url\((['"]*)(.+)(['"]*)\)/) do 
     open, file, close = $1, $2, $3 
     css_dir = File.join(RAILS_ROOT,"public/stylesheets") 
     timestamp = '' 
     FileUtils.cd(css_dir) do 
     if file =~ /^\// # absolute path 
      f = File.new(RAILS_ROOT + "/public" + file) 
     else # relative path 
      f = File.new(file) 
     end 
     timestamp = f.mtime.to_i.to_s 
     end 

     if file =~ /.\.(ico|css|js|gif|jpe?g|png)/ 
     "url(#{open}#{file}?#{timestamp}#{close})" 
     else 
     "url(#{open}#{file}#{close})" 
     end 
    end 

(! Probablemente hay una forma más elegante de escribir esto, mis chuletas de rubí son todavía débiles) Ahora que el truco se está poniendo feo, pensarías que habría una forma más de Rails de hacer esto.

+0

Su expresión regular no funcionó realmente para mí cuando había citas. Usando '/ url \ ((['"] *) ([^ \ n' "] +) (['"] *) \)/'funciona –

+0

¡Esto funciona increíble! ¡Gracias! – CalebHC

5

He estado usando asset packager, y terminé editando el método compress_css del complemento para resolver este problema. Yo, básicamente, sólo expresiones regulares para las imágenes en el css, e insertar la fecha y hora actual:

timestamp = Time.now.to_s.gsub(/\D/, '') 
source.gsub!(/url\((['"])(.+)(['"])\)/) do 
    open, file, close = $1, $2, $3 
    if file =~ /.\.(ico|css|js|gif|jpe?g|png)/ 
    "url(#{open}#{file}?#{timestamp}#{close})" 
    else 
    "url(#{open}#{file}#{close})" 
    end 
end 

De esta manera, cada vez que puedo implementar, las imágenes comprimidas css contienen marcas de tiempo adjuntas. La caída con este método es que cada imagen no obtiene su propia marca de tiempo, por lo que cada vez que implemente un nuevo CSS, todas las imágenes CSS están 'expiradas'. Mejor que nada a menos que implemente CSS con frecuencia.

+0

Interesante, aunque definitivamente estoy de acuerdo, es menos que ideal tener una marca de tiempo vs cada archivo que tiene su propia marca de tiempo adecuada, pero supongo que esto es mejor que nada. Thx por la propina. – brad

3

La mejor solución parece ser utilizar ERB para generar sus hojas de estilo para que pueda usar los Rails image_ helpers en lugar de las rutas de imagen directas. Es decir, deshágase de su archivo public/stylesheets/application.css y cree la aplicación/views/stylesheets/application.css.erb. También deberá crear un controlador, habilitar el almacenamiento en caché y configurar la ruta.

Aquí está la información completa: http://deaddeadgood.com/2009/9/28/far-future-expires-headers-for-css-images-in-rails

+0

¡perfecto! Exactamente lo que yo' Estoy buscando. En una nota al margen, también comencé a leer sobre Jammit http://documentcloud.github.com/jammit/. ¡Parece una solución bastante buena para empacar activos en los rieles también! – brad

3

En caso de que alguien se topa con esto, Jammit ahora soporta esta fuera de la caja. ¡He estado usando jammit en un nuevo proyecto y estoy increíblemente impresionado!

Cuestiones relacionadas