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

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

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

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

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

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

Ответ 1

Звездочки вместе с 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")

Ответ 2

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

Пример:

app/assets/images/mypic.png

В Ruby:

asset_path('mypic.png')

В .scss:

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

UPDATE:

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

Ответ 3

В 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");

Ответ 4

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

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

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

Гудлак

Ответ 5

В css

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

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

Ответ 6

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

2.3.1 CSS и ERB

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

.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.

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

Ответ 7

Только этот сниппет не работает для меня:

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

Но переименуйте stylename.scss в stylename.css.scss, помогите мне.

Ответ 8

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

Сначала убедитесь, что ваш файл css имеет расширение .scss, если это файл sass.

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

#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"

Ответ 9

ЧТО Я НАЙДЕСЬ ПОСЛЕ ЧАСОВ ВЗАИМОДЕЙСТВИЯ С ЭТИМ:

РАБОТЫ:

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 и загрузить оттуда, но, наконец, что-то произошло.

Ответ 10

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

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

Но только "фон", он делает:

background: url('picture.png');

Ответ 11

В некоторых случаях также может использоваться приложение

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

Источник: http://guides.rubyonrails.org/asset_pipeline.html

Ответ 12

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

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

Ответ 13

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

config.serve_static_assets = true

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

Ответ 14

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

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

в файле style.css, если фоновое изображение заправлено в app/assets/images.

Ответ 15

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

background: #4C2516 url('imagename.png') repeat-y 0 0;

Ответ 16

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

Затем вы можете поставить:

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

Ответ 17

При использовании 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") })");