Come fare riferimento a immagini in CSS all'interno di Rails 4


205

C'è uno strano problema con Rails 4 su Heroku. Quando le immagini vengono compilate, vengono aggiunti degli hash, ma il riferimento a quei file dall'interno dei CSS non ha il nome corretto. Ecco cosa intendo. Ho un file chiamato logo.png. Tuttavia quando appare su heroku viene visualizzato come:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Tuttavia il CSS afferma ancora:

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

Il risultato: l'immagine non viene visualizzata. Qualcuno si imbatte in questo? Come può essere risolto?


1
Cordiali saluti, Heroku ha confermato che si tratta di un bug ... stanno lavorando a una soluzione
Nick ONeill

Puoi darci un aggiornamento su questo? Sto riscontrando lo stesso problema
Minh Danh,

Risposte:


392

I pignoni insieme a Sass hanno alcuni utili aiutanti che puoi usare per portare a termine il lavoro. Pignoni saranno solo elaborano questi aiutanti se le estensioni di file foglio di stile sono o .css.scsso .css.sass.


Assistente specifico per l'immagine:

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

Aiuto agnostico:

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

O se si desidera incorporare i dati dell'immagine nel file CSS:

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

21
asset-data-urlfunziona per me dopo aver modificato il mio file .css in .css.scss in un'app Rails 4. Grazie!
fatman13,

@ fatman13 Sì, funziona solo con file .scss e .sass per quanto ne so.
zeeraw,

Jeff: Gli altri funzionano a condizione che le opzioni dell'URL delle risorse siano impostate correttamente. Non si applica asset-data-urlpoiché incorpora l'intero file all'interno del foglio di stile.
zeeraw,

1
Simile a @ fatman13 da quando stavo usando, sass-railsho finalmente finito per aggiungere l'estensione del file .scssai file .css offensivi in ​​modo che finissero tutti .css.scss, quindi ho sostituito tutte le istanze di url('blah.png')con url(asset-path('blah.png'))(nel mio caso tutti i blah.png erano in un /vendored cartella).
likethesky,

asset-url($asset)dovrebbe essere usato per i pignoni 3, la versione con $asset-typeprobabilmente funziona con qualche versione precedente
prusswan

59

Non so perché, ma l'unica cosa che ha funzionato per me era usare asset_path invece di image_path , anche se le mie immagini sono nella directory assets / images / :

Esempio:

app/assets/images/mypic.png

In Ruby:

asset_path('mypic.png')

In .scss:

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

AGGIORNARE:

Capito che risulta che questi aiutanti di risorse provengono dalla gemma sass-rails (che avevo installato nel mio progetto).


2
funziona per me, soluzione molto buona per le rotaie. Grazie @Yarin
MING,

1
Sì! Dopo diverse ore di sbattere la testa sul muro, la tua soluzione "asset-path" finalmente ha funzionato per me sul mio file .css.scss! background-image: url(asset-path('off.png'))
Raymond Gan,

36

In Rails 4, puoi fare facilmente riferimento a un'immagine che si trova assets/images/nei tuoi .SCSSfile in questo modo:

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

Quando avvii l'applicazione in modalità di sviluppo ( localhost:3000), dovresti vedere qualcosa del tipo:

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

In modalità produzione, le risorse avranno i numeri di supporto della cache:

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

1
@MikeLyons: L'ho appena testato su un nuovissimo progetto Rails 4.1 e distribuito su Heroku e funziona bene per me. Devi aver toccato qualcosa production.rb.
sergserg,


11

Nel css

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

sebbene il percorso originale sia /assets/images/banner.jpg, per convenzione devi aggiungere solo / assets / nel metodo url


1
Usando il semplice ol CSS, pensavo di impazzire - grazie!
Craig McGuff,

2
questo non verrà compilato in produzione
dimitry_n

Wow, grazie, non è molto intuitivo. Quindi credo che tutte le attività nei percorsi di asset ( vendor/assets, app/assets, lib/assets, ecc) ottenere combinati in un singolo asset cartella dopo prepossessing è completo?
oh,

Questo non funzionerà in Produzione perché in Produzione le tue risorse vengono compilate con un hash MD5 applicato alla fine del nome e, con le impostazioni tipiche, /assets/banner.jpgnon funzionerà. Invece sarà qualcosa di simile /assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg. TL; DR Non usare questo.
Joshua Pinter,

10

Nessuna delle risposte dice come, quando avrò l' .css.erbestensione, come fare riferimento alle immagini . Per me ha lavorato sia nella produzione che nello sviluppo :

2.3.1 CSS ed ERB

La pipeline degli asset valuta automaticamente ERB . Ciò significa che se aggiungi un'estensione erb a una risorsa CSS (ad esempio, application.css.erb), allora gli helper come asset_pathsono disponibili nelle tue regole CSS:

.class { background-image: url(<%= asset_path 'image.png' %>) }

Questo scrive il percorso della specifica risorsa a cui si fa riferimento. In questo esempio, sarebbe logico disporre di un'immagine in uno dei percorsi di caricamento delle risorse, ad esempio app/assets/images/image.png, a cui fare riferimento qui. Se questa immagine è già disponibile public/assetscome file con impronta digitale, viene fatto riferimento a quel percorso.

Se si desidera utilizzare un URI di dati, un metodo per incorporare i dati di immagine direttamente nel file CSS , è possibile utilizzare l' asset_data_urihelper.

.logo { background: url(<%= asset_data_uri 'logo.png' %>) }

Ciò inserisce un URI di dati correttamente formattato nell'origine CSS.

Nota che il tag di chiusura non può essere dello stile -%>.


5

Solo questo frammento non funziona per me:

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

Ma rinominare stylename.scss in stylename.css.scss mi aiuta.


4

Facendo riferimento ai documenti di Rails , vediamo che ci sono alcuni modi per collegarsi alle immagini dal CSS. Vai alla sezione 2.3.2.

Innanzitutto, assicurati che il tuo file css abbia l'estensione .scss se è un file sass.

Successivamente, puoi utilizzare il metodo ruby, che è davvero brutto:

#logo { background: url(<%= asset_data_uri 'logo.png' %>) }

Oppure puoi usare il modulo specifico più bello:

image-url("rails.png") returns url(/assets/rails.png)
image-path("rails.png") returns "/assets/rails.png"

Infine, puoi utilizzare il modulo generale:

asset-url("rails.png") returns url(/assets/rails.png)
asset-path("rails.png") returns "/assets/rails.png"

3

COSA HO TROVATO DOPO ORE DI MUCKING CON QUESTO:

LAVORI :

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

// how to add attributes like repeat, center, fixed?

Quanto sopra produce qualcosa di simile: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

Notare il "/" iniziale ed è tra virgolette . Nota anche l' estensione scss e l'helper image_path in yourstylesheet.css.scss. L'immagine si trova nella directory app / assets / images .

Non funziona:

background: url(image_path('transparent_2x2.png') repeat center center fixed;

non funziona, proprietà non valida:

background:url(/assets/pretty_photo/default/sprite.png) 2px 1px repeat center fixed;

La mia ultima risorsa sarebbe stata quella di metterli nel mio secchio s3 pubblico e caricarli da lì, ma alla fine riuscì a fare qualcosa.


Per chiunque venga qui e abbia ancora problemi: assicurati che il tuo file css sia aggiornato e che non hai precompilato le tue risorse localmente e che hai dimenticato di aggiornarle.
Hartwig,

Hartwig - cosa significa? Vuoi dire che devi eseguire di nuovo la precompilazione prima che questo metodo funzioni? Ho provato tutto ciò che è stato suggerito in questo post (tutto) e niente funziona per me
Mel

2

È interessante notare che se uso "immagine di sfondo", non funziona:

background-image: url('picture.png');

Ma solo "background", fa:

background: url('picture.png');

ma funziona solo dal file scss, non quando viene inserito in un'assegnazione di proprietà di stile all'interno di un div ... sono confuso
AnderSon


1

Quando si usa gem 'sass-rails', in Rails 5, bootstrap 4, per me ha funzionato quanto segue,

nel file .scss:

    background-image: url(asset_path("black_left_arrow.svg"));

nel file di visualizzazione (ad esempio .html.slim):

    style=("background-image: url(#{ show_image_path("event_background.png") })");

0

Questo dovrebbe portarti lì ogni volta.

background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);


0

In Rails 4, usa semplicemente

.hero { background-image: url("picture.jpg"); }

nel tuo file style.css a condizione che l'immagine di sfondo sia nascosta in app / assets / images.


Leggi la domanda completa
Adriano Resende il

0

Puoi aggiungere l'estensione css .erb. Ej: style.css.erb

Quindi puoi mettere:

background: url(<%= asset_path 'logo.png' %>) no-repeat;

0

Questo ha funzionato per me:

background: #4C2516 url('imagename.png') repeat-y 0 0;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.