Как ссылаться на изображения в CSS в Rails 4

205

Есть странная проблема с Rails 4 на Heroku. Когда изображения компилируются, к ним добавляются хэши, но для ссылки на эти файлы из CSS не корректируется правильное имя. Вот что я имею в виду. У меня есть файл с именем logo.png. И все же, когда он появляется на героку, он рассматривается как:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Однако CSS все еще утверждает:

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

Результат: изображение не отображается. Кто-нибудь сталкивался с этим? Как это можно решить?

Ник ONeill
источник
1
Просто к вашему сведению, Heroku подтвердил, что это ошибка ... они работают над решением
Ник ONeill
Можете ли вы дать обновление по этому поводу? У меня та же проблема
Мин Дан

Ответы:

392

У звездочек вместе с Sass есть несколько отличных помощников, которых вы можете использовать для выполнения работы. Звездочки будут только обрабатывать эти помощник , если ваши расширения таблицы стилей файлов либо .css.scssили .css.sass.


Изображение конкретного помощника:

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

Агностический помощник:

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

Или, если вы хотите встроить данные изображения в файл CSS:

background-image: asset-data-url("logo.png")
zeeraw
источник
21
asset-data-urlработает для меня после того, как я изменил свой файл .css на файл .css.scss в приложении Rails 4. Спасибо!
fatman13
@ fatman13 Да, насколько я знаю, это работает только с файлами .scss и .sass.
zeeraw
Джефф: Остальные работают, если ваши параметры URL-адреса актива настроены правильно. Он не применяется, asset-data-urlпоскольку он встраивает весь файл в таблицу стилей.
Zeeraw
1
Подобно @ fatman13 , так как я использовал sass-railsя , наконец , в конечном итоге добавив расширение файла .scssна нарушившего .css файл (ы) , так что они все заканчиваются .css.scss, а затем заменить все экземпляры url('blah.png')с url(asset-path('blah.png'))(в моем случае все blah.pngs были в /vendorред папка).
ликетический
asset-url($asset)следует использовать для звездочек 3, версия, $asset-typeвероятно, работает с более старой версией
prusswan
59

Не знаю почему, но единственное , что работал для меня использовал asset_path вместо из image_path , даже если мои изображения находятся под активы / изображений / каталога:

Пример:

app/assets/images/mypic.png

В рубине:

asset_path('mypic.png')

В .scss:

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

ОБНОВИТЬ:

Оказалось, что эти помощники актива происходят из самоцвета sass-rails (который я установил в своем проекте).

Ярина
источник
2
работает для меня, действительно очень хорошее решение пути рельсов. Спасибо @Ярин
MING
1
Да! После нескольких часов удара головой о стену, ваше решение «путь к активам» наконец-то сработало для меня в моем файле .css.scss! background-image: url(asset-path('off.png'))
Рэймонд Ган
36

В Rails 4 вы можете легко ссылаться на изображение, расположенное assets/images/в ваших .SCSSфайлах, например так:

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

Когда вы запускаете приложение в режиме разработки ( localhost:3000), вы должны увидеть что-то вроде:

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

В производственном режиме ваши активы будут иметь номера помощника кэша:

background-image: url("/assets/pretty-background-image-8b313354987c309e3cd76eabdb376c1e.jpg");
sergserg
источник
1
@MikeLyons: Просто протестировал его на новом проекте Rails 4.1 и развернул на Heroku, и он отлично работает для меня. Вы, должно быть, что-то коснулись production.rb.
sergserg
25

Хеш заключается в том, что конвейер ресурсов и сервер оптимизируют кэширование http://guides.rubyonrails.org/asset_pipeline.html

Попробуйте что-то вроде этого:

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

Удачи

Мауро Диас
источник
Работал на меня! Спасибо :)
Даниэль
В вашем случае какое должно быть расширение файла? Только .cssне работал для меня.
Arup Rakshit
Работа для меня! Спасибо брат!
AlejandroJSR7
11

В css

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

хотя исходный путь - /assets/images/banner.jpg, по соглашению вы должны добавить просто / assets / в метод url

user2458192
источник
1
Используя обычный старый CSS, я думал, что схожу с ума - спасибо!
Крейг Макгафф
2
это не будет скомпилировано в производстве
dimitry_n
Вау, спасибо, это не очень интуитивно понятно. Таким образом , я предполагаю , что все активы в пути активов ( vendor/assets, app/assets, lib/assetsи т.д.) получают объединены в единую папку активов после завершения располагающий?
ооо
Это не будет работать в Production, потому что в Production ваши активы компилируются с использованием хеша MD5, прикрепленного к концу имени, и, с обычными настройками, /assets/banner.jpgне будут работать. Вместо этого это будет что-то вроде /assets/banner-f719451f1e0ddd15f153c4eedde044b2.jpg. TL; DR Не используйте это.
Джошуа Пинтер
10

Ни один из ответов не говорит о том, как, когда у меня будет .css.erbрасширение, как ссылаться на изображения . Для меня работали как в производстве, так и в разработке :

2.3.1 CSS и ERB

Конвейер активов автоматически оценивает ERB . Это означает, что если вы добавите расширение erb к ресурсу CSS (например, application.css.erb), то asset_pathв ваших правилах CSS будут доступны подобные помощники :

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

Это записывает путь к конкретному активу, на который ссылаются. В этом примере было бы целесообразно иметь изображение в одном из путей загрузки ресурса, например app/assets/images/image.png, на которое здесь будет ссылаться. Если это изображение уже доступно в public/assetsвиде файла с отпечатками пальцев, то на этот путь ссылаются.

Если вы хотите использовать URI данных - метод встраивания данных изображения непосредственно в файл CSS - вы можете использовать asset_data_uriпомощник.

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

Это вставит правильно отформатированный URI данных в источник CSS.

Обратите внимание, что закрывающий тег не может иметь стиль -%>.

Аруп Ракшит
источник
5

Только этот фрагмент не работает для меня:

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

Но переименование stylename.scss в stylename.css.scss помогает мне.

s.vatagin
источник
4

Обращаясь к документам Rails, мы видим, что существует несколько способов ссылки на изображения из CSS. Просто перейдите в раздел 2.3.2.

Во-первых, убедитесь, что ваш файл CSS имеет расширение .scss, если это файл sass.

Далее вы можете использовать метод ruby, который действительно ужасен:

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

Или вы можете использовать конкретную форму, которая лучше:

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

Наконец, вы можете использовать общую форму:

asset-url("rails.png") returns url(/assets/rails.png)
asset-path("rails.png") returns "/assets/rails.png"
Ник Рес
источник
3

ЧТО Я НАШЕЛ ПОСЛЕ ЧАСОВ МУЖЕНИЯ С ЭТИМ:

РАБОТАЕТ :

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

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

Выше приведено что-то вроде: "/assets/transparent_2x2-ec47061dbe4fb88d51ae1e7f41a146db.png"

Обратите внимание на начальный «/» , и он в кавычках . Также обратите внимание на расширение scss и помощник image_path в yourstylesheet.css.scss. Изображение находится в каталоге app / assets / images .

Не работает:

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

не работает, недействительное свойство:

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

Моим последним средством было поместить их в мое общедоступное ведро s3 и загрузить оттуда, но наконец-то все заработало.

Дэнни
источник
Для тех, кто приходит сюда и у вас все еще есть проблемы: убедитесь, что ваш CSS-файл обновлен и что вы не скомпилировали свои ресурсы локально и не забыли об их обновлении.
Хартвиг
Хартвиг ​​- что это значит? Вы имеете в виду, что вам нужно снова запустить прекомпиляцию, прежде чем этот метод заработает? Я перепробовал все, что было предложено в этом посте (все), и у меня ничего не работает
Mel
2

Интересно, что если я использую 'background-image', он не работает:

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

Но просто «фон», это делает:

background: url('picture.png');
AnderSon
источник
но это работает только из файла scss, а не когда помещается в присваивание свойства стиля внутри div ... я запутался
AnderSon
1

При использовании gem 'sass-rails' в Rails 5, bootstrap 4, у меня сработало следующее:

в файле .scss:

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

в файле представления (например, .html.slim):

    style=("background-image: url(#{ show_image_path("event_background.png") })");
Mehreen
источник
0

Это должно привести вас туда каждый раз.

background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);
Джошуа Натаниэль
источник
0

По умолчанию Rails 4 не будет обслуживать ваши активы. Чтобы включить эту функцию, вам нужно зайти в config / application.rb и добавить эту строку:

config.serve_static_assets = true

https://devcenter.heroku.com/articles/rails-4-asset-pipeline#serve-assets

ksiomelo
источник
1
Это работает, но разве это не отменит преимущества предварительной компиляции активов?
Arcolye
0

В Rails 4 просто используйте

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

в вашем файле style.css, если фоновое изображение скрыто в app / assets / images.

Boussac
источник
Читайте вопрос полностью
Адриано Резенди
0

Вы можете добавить в расширение CSS .erb. Ej: style.css.erb

Тогда вы можете положить:

background: url(<%= asset_path 'logo.png' %>) no-repeat;
Матиас Сегуэль
источник
0

Это сработало для меня:

background: #4C2516 url('imagename.png') repeat-y 0 0;
Tolome
источник