2009-09-08 14 views
10

L'horodatage So Rails est génial. Je l'utilise pour ajouter les en-têtes expirés à tous les fichiers qui se terminent dans l'horodatage à 10 chiffres. La plupart de mes images sont cependant référencées dans mon CSS. Quelqu'un at-il trouvé une méthode qui permet d'ajouter des horodatages aux images référencées CSS, ou une règle de réécriture funky qui réalise cela? J'aimerais que TOUTES les images de mon site, à la fois en ligne et en CSS, aient cet horodatage afin que je puisse dire au navigateur de les mettre en cache, mais de les actualiser chaque fois que le fichier lui-même change.Rails horodatages sur les images en CSS

Je n'ai rien trouvé sur le net à ce sujet et je ne peux pas croire que ce sujet ne soit pas discuté plus fréquemment.

Je ne pense pas que ma configuration sera question parce que la Expiring réelle , espérons arriver de la même manière, en fonction de l'horodatage à 10 chiffres, mais j'utilise apache pour servir tout le contenu statique si cela importe

+0

Voir ma réponse ci-dessous, je pense que la meilleure solution maintenant pour utiliser Jammit, pour un emballage qui prend en charge ce hors de la boîte – brad

Répondre

4

Vous pouvez ajouter l'horodatage réel de chaque fichier image en obtenant le temps de modification de fichier comme ceci:

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 

(! Il y a probablement une façon plus élégante d'écrire, mes côtelettes de rubis sont encore faibles) Maintenant le bidouillage devient laid, cependant ... vous penseriez qu'il y aurait une façon plus Rails de faire ça.

+0

Votre expression régulière n'a pas vraiment fonctionné pour moi quand les citations étaient autour. En utilisant '/ url \ ((['"] *) ([^ \ n' "] +) (['"] *) \)/'fonctionne –

+0

Cela fonctionne génial! Merci! – CalebHC

5

J'ai utilisé asset packager, et j'ai fini par éditer la méthode compress_css du plugin pour résoudre ce problème. Je fondamentalement juste Regex pour les images dans le css, et insérez l'horodatage actuel:

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 cette façon, chaque fois que je Deploy, les images compressées contiennent css horodatages en annexe. La chute de cette méthode est que chaque image n'a pas son propre horodatage, donc chaque fois que vous déployez un nouveau CSS, toutes les images CSS sont 'expirées'. Mieux que rien à moins de déployer des CSS souvent.

+0

Intéressant, bien que je sois définitivement d'accord, il est moins qu'idéal ayant le timestamp vs chaque fichier ayant son propre timestamp correct, mais je suppose que c'est mieux que rien. Merci pour le conseil. – brad

3

La meilleure solution semble être d'utiliser ERB pour générer vos feuilles de style afin que vous puissiez utiliser les Rails image_ helpers au lieu des chemins d'image directs. C'est-à-dire, débarrassez-vous de votre fichier public/stylesheets/application.css et créez app/views/stylesheets/application.css.erb. Vous devrez également créer un contrôleur et activer la mise en cache, puis configurer l'itinéraire.

Voici les détails: http://deaddeadgood.com/2009/9/28/far-future-expires-headers-for-css-images-in-rails

+0

parfait! Exactement ce que je' D'un autre côté, je viens aussi de commencer à lire sur Jammit http://documentcloud.github.com/jammit/ Cela ressemble à une très bonne solution pour l'emballage des biens dans les rails! – brad

3

Au cas où quelqu'un trébuche sur ce, Jammit soutient maintenant ce hors de la boîte. J'utilise Jammit sur un nouveau projet et je suis incroyablement impressionné!

Questions connexes