Як посилатися на зображення в CSS в межах Rails 4


205

Існує дивна проблема з Rails 4 на Heroku. Коли компілюються зображення, до них додаються хеші, але посилання на ці файли з CSS не коригуються відповідною назвою. Ось що я маю на увазі. У мене є файл під назвою logo.png. Але коли він відображається на heroku, він розглядається як:

/assets/logo-200a00a193ed5e297bb09ddd96afb953.png

Однак CSS все ще говорить:

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

Результат: зображення не відображається. Хтось натрапив на це? Як це можна вирішити?


1
Тільки FYI, Heroku підтвердив, що це помилка ... вони працюють над вирішенням
Нік ONeill

Чи можете ви ознайомитись з цим? У мене те саме питання
Minh Danh

Відповіді:


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

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
працює для мене, насправді дуже гарне рішення рейок. Дякую @Yarin
AMIC 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");

1
@MikeLyons: Просто перевірив його на абсолютно новому проекті Rails 4.1 і розмістив на Heroku, і він працює добре для мене. Напевно, ви щось зачепили production.rb.
сергерг

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, за умовою ви повинні додати просто / активи / у методі url


1
Використовуючи звичайний ol CSS, я думав, що я збожеволію - дякую!
Крейг МакГуфф

2
це не
складеться

Нічого собі, дякую, це не дуже інтуїтивно. Таким чином , я припускаю , що всі активи в дорозі активів ( vendor/assets, app/assets, lib/assetsі т.д.) отримують об'єднані в єдину папку активів після завершення володіє?
ой

У виробництві це не працюватиме, оскільки у виробництві ваші активи збираються з отримання хеша 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 .


4

Посилання на документи на 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"

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. Зображення знаходиться в каталозі програми / активів / зображень .

Не працює:

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 оновлений та що ви не попередньо склали свої активи на локальному рівні та забули про їх оновлення.
Хартвіг

Хартвіг - що це означає? Ви маєте на увазі, що вам доведеться запустити прекомпіляцію ще раз, перш ніж цей метод спрацює? Я спробував усе, що пропонується на цій посаді (усе), і для мене нічого не працює
Мел,

2

Цікаво, що якщо я використовую 'background-image', він не працює:

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

Але просто "фон", це:

background: url('picture.png');

але це працює лише з scss-файлу, а не коли він розміщений у призначенні властивостей стилю в межах div ... я
плутаюсь


1

Коли я використовував дорогоцінний камінь «sass-rails», у Rails 5, завантажувальному пристрої 4, для мене працювало наступне,

у .scss-файлі:

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

у файлі перегляду (наприклад, .html.slim):

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


0

За замовчуванням Rails 4 не обслуговуватиме ваші активи. Щоб увімкнути цю функціональність, потрібно зайти в config / application.rb і додати цей рядок:

config.serve_static_assets = true

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


1
Це працює, але чи це не скасує переваги попереднього збирання активів?
Arcolye

0

У Rails 4 просто використовуйте

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

у вашому файлі style.css, якщо фонове зображення розміщено у додатку / активах / зображеннях.


Прочитати повне запитання
Adriano Resende

0

Ви можете додати до розширення css .erb. Ej: style.css.erb

Потім ви можете покласти:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.