212 votes

Rails : Comment référencer des images en CSS dans Rails 4

Il y a un problème étrange avec Rails 4 sur Heroku. Lorsque les images sont compilées, des hashs leur sont ajoutés, mais les références à ces fichiers dans CSS n'ont pas le bon nom ajusté. Voici ce que je veux dire. J'ai un fichier appelé logo.png. Pourtant, lorsqu'il apparaît sur Heroku, il est affiché comme suit :

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Cependant, le CSS indique toujours :

background-image:url("./logo.png");

Résultat : l'image ne s'affiche pas. Quelqu'un a rencontré ce problème ? Comment le résoudre ?

1 votes

Pour info, Heroku a confirmé qu'il s'agit d'un bogue... ils travaillent sur une solution.

0 votes

Pouvez-vous faire le point à ce sujet ? J'ai le même problème

405voto

zeeraw Points 1492

Sprockets avec Sass a quelques aides astucieuses que vous pouvez utiliser pour faire le travail. Les pignons uniquement traiter ces aides si les extensions de votre fichier de feuille de style sont soit .css.scss o .css.sass .


Aide spécifique à l'image :

background-image: image-url("logo.png")

Aide agnostique :

background-image: asset-url("logo.png", image)
background-image: asset-url($asset, $asset-type)

Ou si vous voulez intégrer les données de l'image dans le fichier css :

background-image: asset-data-url("logo.png")

23 votes

asset-data-url fonctionne pour moi après avoir changé mon fichier .css en fichier .css.scss dans une application Rails 4. Merci !

0 votes

@fatman13 Oui, pour autant que je sache, cela ne fonctionne qu'avec les fichiers .scss et .sass.

0 votes

Jeff : Les autres fonctionnent si les options d'url de vos actifs sont correctement configurées. Cela ne s'applique pas pour asset-data-url puisqu'il intègre l'ensemble du fichier à l'intérieur de la feuille de style.

61voto

Yarin Points 18186

Je ne sais pas pourquoi, mais la seule chose qui a marché pour moi était d'utiliser chemin_de_l'actif au lieu de de chemin_image même si mes images sont sous le nom de assets/images/ répertoire :

Ejemplo:

app/assets/images/mypic.png

En Ruby :

asset_path('mypic.png')

En .scss :

url(asset-path('mypic.png'))

UPDATE :

J'ai compris - il s'avère que ces aides à l'immobilisation proviennent de l' sass-rails (que j'avais installé dans mon projet).

2 votes

Cela fonctionne pour moi, c'est vraiment une très bonne solution pour les rails. Merci @Yarin

1 votes

Oui ! Après plusieurs heures à me taper la tête contre le mur, votre solution "asset-path" a finalement fonctionné pour moi sur mon fichier .css.scss ! background-image: url(asset-path('off.png'))

0 votes

Pour ceux qui construisent avec Rails 6, vous n'avez pas besoin d'installer le fichier sass-rails la pierre précieuse. Les assistants travaillent en dehors de la boîte.

37voto

Serg Points 3253

Dans Rails 4, vous pouvez faire référence à une image située dans le dossier assets/images/ dans votre .SCSS des fichiers facilement comme ceci :

.some-div {
  background-image: url(image-path('pretty-background-image.jpg'));
}

Lorsque vous lancez l'application en mode développement ( localhost:3000 ), vous devriez voir quelque chose comme :

background-image: url("/assets/pretty-background-image.jpg");

En mode production, vos actifs auront les numéros d'aide de cache :

background-image: url("/assets/pretty-background-image-8b313354987c309e3cd76eabdb376c1e.jpg");

1 votes

@MikeLyons : Je viens de le tester sur un tout nouveau projet Rails 4.1 et de le déployer sur Heroku et il fonctionne bien pour moi. Vous devez avoir touché quelque chose sur production.rb .

25voto

Mauro Dias Points 384

Le hachage est dû au fait que le pipeline d'actifs et le serveur optimisent la mise en cache. http://guides.rubyonrails.org/asset_pipeline.html

Essayez quelque chose comme ça :

 background-image: url(image_path('check.png'));

Goodluck

0 votes

Dans votre cas, quelle devrait être l'extension du fichier ? Seulement .css n'a pas fonctionné pour moi.

0 votes

Travaillez pour moi ! Merci mon frère !

11voto

user2458192 Points 43

En css

background: url("/assets/banner.jpg");

bien que le chemin original soit /assets/images/banner.jpg, par convention vous devez ajouter juste /assets/ dans la méthode url

1 votes

En utilisant le simple CSS, je pensais que je devenais fou - merci !

2 votes

Ceci ne sera pas compilé en production

0 votes

Wow, merci, ce n'est pas très intuitif. Donc je suppose que tous les actifs dans les chemins d'actifs ( vendor/assets , app/assets , lib/assets ) sont regroupés dans un seul dossier d'actifs une fois la prise de possession terminée ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X