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

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

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

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

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

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

16 ответов

Решение

У звездочек вместе с Sass есть несколько отличных помощников, которых вы можете использовать для выполнения работы. Sprockets будет обрабатывать эти помощники только в том случае, если ваши расширения .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")

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

Пример:

app/assets/images/mypic.png

В рубине:

asset_path('mypic.png')

В.scss:

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

ОБНОВИТЬ:

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

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

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

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

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

Удачи

В css

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

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

Ни один из ответов не говорит о том, когда я буду .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.

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

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

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

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

Обращаясь к документам 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"

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

РАБОТАЕТ:

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

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

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

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

background: url('picture.png');

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

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

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

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

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

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

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

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

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

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

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

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

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

config.serve_static_assets = true

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

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

background-image: url(<%= asset_data_uri 'transparent_2x2.png'%>);
Другие вопросы по тегам