Como referenciar imagens em CSS no Rails 4


205

Há um problema estranho com o Rails 4 no Heroku. Quando as imagens são compiladas, eles adicionam hashes, mas a referência a esses arquivos no CSS não tem o nome adequado ajustado. Aqui está o que eu quero dizer. Eu tenho um arquivo chamado logo.png. No entanto, quando aparece no heroku, é visto como:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

No entanto, o CSS ainda afirma:

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

O resultado: a imagem não é exibida. Alguém encontrou isso? Como isso pode ser resolvido?


1
Apenas FYI, Heroku confirmou que é um erro ... eles estão trabalhando em uma solução
Nick ONeill

Você pode dar uma atualização sobre isso? Estou tendo o mesmo problema
Minh Danh

Respostas:


392

As rodas dentadas, juntamente com Sass, têm alguns ajudantes bacanas que você pode usar para fazer o trabalho. Rodas dentadas será única processar esses ajudantes se suas extensões de arquivo de estilo ou são .css.scssou .css.sass.


Auxiliar específico da imagem:

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

Auxiliar agnóstico:

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

Ou se você deseja incorporar os dados da imagem no arquivo css:

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

21
asset-data-urlfunciona para mim depois que alterei meu arquivo .css para o arquivo .css.scss em um aplicativo do Rails 4. Obrigado!
precisa saber é o seguinte

@ fatman13 Sim, isso funciona apenas com arquivos .scss e .sass até onde eu sei.
precisa saber é o seguinte

Jeff: Os outros funcionam, desde que as opções de URL do seu recurso estejam configuradas corretamente. Ele não se aplica, asset-data-urlpois incorpora o arquivo inteiro na folha de estilo.
zeeraw

1
Semelhante a @ fatman13 desde que eu estava usando sass-rails, finalmente acabei adicionando a extensão .scssao (s) arquivo (s) .css ofensivos, para que todos terminem .css.scsse substituam todas as instâncias de url('blah.png')with url(asset-path('blah.png'))(no meu caso, todos os blah.pngs estavam em um /vendored pasta).
likethesky

asset-url($asset)deve ser usado para rodas dentadas 3, a versão com $asset-typeprovavelmente funciona com alguma versão mais antiga
prusswan

59

Não sei por que, mas a única coisa que funcionou para mim foi usar asset_path em vez de image_path , mesmo que minhas imagens estejam no diretório assets / images / :

Exemplo:

app/assets/images/mypic.png

Em Ruby:

asset_path('mypic.png')

Em .scss:

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

ATUALIZAR:

Achei que esses auxiliares de recursos provêm da gema sass-rails (que eu havia instalado no meu projeto).


2
funciona para mim, realmente muito boa solução rails way. Obrigado @Yarin
AMIC MING

1
Sim! Após várias horas batendo minha cabeça na parede, sua solução "caminho do ativo" finalmente funcionou para mim no meu arquivo .css.scss! background-image: url(asset-path('off.png'))
Raymond Gan

36

No Rails 4, você pode fazer referência a uma imagem localizada assets/images/nos seus .SCSSarquivos facilmente desta forma:

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

Ao iniciar o aplicativo no modo de desenvolvimento ( localhost:3000), você verá algo como:

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

No modo de produção, seus ativos terão os números auxiliares de cache:

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

1
@ MikeLyons: Acabei de testá-lo em um novo projeto do Rails 4.1 e implantado no Heroku, e está funcionando bem para mim. Você deve ter tocado em algo production.rb.
Sergserg #


11

Em css

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

embora o caminho original seja /assets/images/banner.jpg, por convenção, você deve adicionar apenas / assets / no método url


1
Usando CSS simples, pensei que estava ficando louco - obrigado!
Craig McGuff

2
isso não será compilado na produção
dimitry_n

Uau, obrigado, isso não é muito intuitivo. Então eu acho que todos os ativos nos caminhos de ativos ( vendor/assets, app/assets, lib/assets, etc) se combinados em um único ativo pasta após prepossessing está completa?
ohhh

Isso não funcionará na Produção, porque na Produção seus recursos são compilados com um hash MD5 afixado no final do nome e, com configurações típicas, /assets/banner.jpgnão funciona. Em vez disso, será algo parecido /assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg. TL; DR Não use isso.
Joshua Pinter

10

Nenhuma das respostas diz sobre o caminho, quando terei .css.erbextensão, como fazer referência a imagens . Para mim, trabalhei tanto na produção quanto no desenvolvimento :

2.3.1 CSS e ERB

O pipeline de ativos avalia automaticamente o ERB . Isso significa que, se você adicionar uma extensão erb a um ativo CSS (por exemplo application.css.erb), auxiliares como asset_pathestão disponíveis nas suas regras CSS:

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

Isso grava o caminho para o ativo específico que está sendo referenciado. Neste exemplo, faria sentido ter uma imagem em um dos caminhos de carregamento de ativos, como app/assets/images/image.png, que seria referenciado aqui. Se essa imagem já estiver disponível public/assetscomo um arquivo com impressão digital, esse caminho será referenciado.

Se você deseja usar um URI de dados - um método para incorporar os dados da imagem diretamente no arquivo CSS - você pode usar o asset_data_uriauxiliar.

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

Isso insere um URI de dados formatado corretamente na fonte CSS.

Observe que a tag de fechamento não pode ser do estilo -%>.


5

Somente este trecho não funciona para mim:

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

Mas renomear stylename.scss para stylename.css.scss me ajuda.


4

Fazendo referência aos documentos do Rails , vemos que existem algumas maneiras de vincular imagens a partir de css. Basta ir para a seção 2.3.2.

Primeiro, verifique se o seu arquivo css tem a extensão .scss, se for um arquivo sass.

Em seguida, você pode usar o método ruby, que é realmente feio:

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

Ou você pode usar o formulário específico mais agradável:

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

Por fim, você pode usar o formulário geral:

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

3

O QUE EU ENCONTREI APÓS HORAS DE MUCKING COM ESTE:

TRABALHO :

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

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

O resultado acima gera algo como: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

Observe o "/" inicial e está entre aspas . Observe também a extensão scss e o auxiliar image_path em yourstylesheet.css.scss. A imagem está no diretório app / assets / images .

Não funciona:

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

não funciona, propriedade inválida:

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

Meu último recurso seria colocá-los no meu balde público s3 e carregar a partir daí, mas finalmente consegui algo.


Para quem vem aqui e ainda tem problemas: verifique se o seu arquivo css está atualizado e se você não pré-compilou seus ativos localmente e esqueceu de atualizá-los.
Hartwig

Hartwig - o que isso significa? Quer dizer que você precisa executar a pré-compilação novamente antes que esse método funcione? Eu tentei de tudo o que é sugerido neste post (tudo) e nada está funcionando para mim #
181

2

Curiosamente, se eu usar 'background-image', ele não funcionará:

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

Mas apenas 'background', ele faz:

background: url('picture.png');

mas isso só funciona a partir do arquivo SCSS, não quando colocado em uma atribuição de propriedade de estilo dentro de uma div ... eu sou confundir
Anderson


1

Ao usar o gem 'sass-rails', no Rails 5, bootstrap 4, o seguinte funcionou para mim,

no arquivo .scss:

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

no arquivo de visualização (por exemplo, .html.slim):

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

0

Isso deve levá-lo lá todas as vezes.

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


0

No Rails 4, basta usar

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

no seu arquivo style.css, desde que a imagem de plano de fundo esteja dobrada em app / assets / images.


Leia a pergunta completa
Adriano Resende

0

Você pode adicionar à sua extensão css .erb. Ej: style.css.erb

Então você pode colocar:

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

0

Isso funcionou para mim:

background: #4C2516 url('imagename.png') repeat-y 0 0;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.