2009-10-18 7 views
2

J'utilise un format PNG transparent avec la bibliothèque Google IE fix. Cette correction ne fonctionne que sur les URL d'images qui se terminent par "-trans.png".URL de ressources sans horodatage de cache dans Rails

La mise en cache basée sur l'horodatage de Rails pose problème. Lorsque j'utilise image_path() pour générer l'URL de l'image, elle ajoute l'horodatage modifié en dernier lieu à la chaîne de requête de l'image. Comme l'URL ne se termine plus par "-trans.png" (au lieu de "?" Plus un entier long), le javascript de Google ne peut pas être activé.

Je ne veux pas disable asset caching entirely; juste sur certaines images. Je ne veux pas non plus coder en dur une URL relative à la racine du serveur. Je veux utiliser Rails pour générer l'URL correctement si le site est déployé sur la racine du serveur ou un sous-répertoire (inconnu).

Quelles options ai-je?

Répondre

1
# apologies I'm doing this off the cuff and haven't run-tested this code 
alias_method_chain :image_path, :google_sense 

def image_path_with_google_sense(source) 
    raw_image_path = image_path_without_google_sense(source) 
    if source.end_with?('-trans.png') 
    # strip off the time stamp 
    raw_image_path.split('?').first 
    else 
    raw_image_path 
    end 
end 
+0

J'espérais éviter d'avoir à supprimer la chaîne de requête, mais c'est la seule réponse à ce jour. Merci :-) –

0

je suis venu avec une façon complètement différente de résoudre ce problème, en utilisant jQuery pour remplacer les URL appropriées:

jQuery(document).ready(function($) { 
    $("img.logo").attr("src", "/images/logo-trans.png"); 
}); 

L'avantage est que je peux faire le IE- de cache-décapage uniquement en utilisant les commentaires HTML conditionnels d'IE.

+1

Intéressant mais votre code d'exemple a quelques problèmes comme le remplacement de chaque balise IMG avec la classe "logo" sur la page ce qui est bien si vous êtes la seule personne travaillant sur le code mais pourrait être un grand moment WTF si certains autres concepteurs font le faux pas de l'utilisation de la même combinaison tag/classe pour une autre image. Cela ne fonctionne également que pour une image particulière. Vous avez impliqué dans votre question que vous aviez plusieurs images que vous vouliez "réparer", donc vous pourriez être mieux avec un motif correspondant à la valeur "src", ce que je pense que jQuery peut faire. –

+1

Ouais, vous pouvez utiliser ceci: $ ("img [src * = '- trans.png']") –

+0

Ouais, vous êtes là. –

0

La solution est plus facile probablement ajouter un cas particulier lorsque l'étiquette de l'actif est ajouté au nom de fichier pour le faire fonctionner correctement, par exemple:

def rewrite_asset_path(source) 
     asset_id = rails_asset_id(source) 
     if asset_id.blank? 
     source 
     elsif source.end_with?("-trans.png") 
     "#{source[0..-11]}.#{asset_id}-trans.png" 
     else 
     source + "?#{asset_id}" 
     end 
    end 

De cette façon, l'une des images auront leurs chemins réécrit pour avoir le cache-buster en ligne. Cela fonctionne toujours comme vous le souhaitez.

Questions connexes