Rails 4 image-path, image-url и asset-url больше не работают в файлах SCSS

99

Должны ли мы использовать что-то еще помимо image-urlи других в Rails 4? Они возвращают разные значения, которые кажутся бессмысленными. Если я logo.pngв /app/assets/images/logo.pngи я делаю следующее, это то , что я получаю:

image-url("logo.png") -> url("/images/logo.png") #obviously doesn't work
image-path("logo.png") -> "/images/logo.png"
asset-url("logo.png") -> url("/logo.png")

Конечно, ничего из этого не работает, потому что они нужны как минимум /assetsспереди.

ОБНОВЛЕНИЕ : На самом деле, я только что заметил, как мне получить доступ к изображениям в Rails 4? У меня есть изображение на/app/assets/images/logo.png. Но если я перейду на любой из следующих URL-адресов, я все равно не увижу свое изображение:

http://localhost:3000/assets/logo.png
http://localhost:3000/assets/images/logo.png
http://localhost:3000/logo.png
http://localhost:3000/images/logo.png

ОБНОВЛЕНИЕ 2 : Единственный способ вызвать свойlogo.png- это переместить его в/app/assets/stylesheetsкаталог и затемвызвать:

http://localhost:3000/assets/logo.png
в.
источник
Попробуйте это:asset_path("logo.png", image)
Марсело Де Полли
@depa - это просто преобразовано в "/logo.png", что не вызывает мое изображение.
у.
3
Вы используете этот помощник внутри .cssфайла или в .css.scssфайле?
Марсело Де Полли
@depa - без помощника. Я думаю, что это более серьезная проблема с активами, которые просто не работают для моей папки изображений
в.
1
@depa - о, я понимаю, о чем вы спрашиваете. Он находится внутри .css.scssфайла
в.

Ответы:

113

У меня сама была эта проблема. 3 пункта, которые, надеюсь, помогут:

  • Если вы помещаете изображения в свой app/assets/imagesкаталог, вы должны иметь возможность вызывать изображение напрямую без префикса в пути. т.е.image_url('logo.png')
  • В зависимости от того, где вы используете актив, будет зависеть метод. Если вы используете его как background-image:свойство, тогда ваша строка кода должна быть background-image: image-url('logo.png'). Это работает как для таблиц стилей less, так и для sass. Если вы используете его встроенным в представление, вам нужно будет использовать встроенный image_tagпомощник в rails для вывода изображения. Еще раз без префикса<%= image_tag 'logo.png' %>
  • Наконец, если вы предварительно компилируете свои активы, запускаете их rake assets:precompileдля генерации активов или rake assets:precompile RAILS_ENV=productionдля производства, в противном случае ваша производственная среда не будет иметь отпечатанных активов при загрузке страницы.

Также для этих команд в пункте 3 вам нужно будет поставить перед ними префикс, bundle execесли вы используете Bundler.

cdaloisio
источник
1
Другой момент - прочитать документацию guides.rubyonrails.org/asset_pipeline.html . Вы также можете увидеть в отладке веб-разработчика своего браузера, загружаются ли изображения?
H.Rabiee
3
Вот как вы пишете ответ. Каждый сценарий. Предсказание «а что, если», никаких дел. Отметка того, кто «видел бой» (действительно работал над проблемой).
ahnbizcad
Меня несколько раз укусило отсутствие RAILS_ENV = production.
Sixty4Bit 04
62

Ваша первая формулировка image_url('logo.png')верна. Если изображение найдено, оно сгенерирует путь /assets/logo.png(плюс хэш в производстве). Однако, если Rails не может найти образ, который вы назвали, он вернется к нему /images/logo.png.

Следующий вопрос: почему Rails не находит ваше изображение? Если вы поместите его в app / assets / images / logo.png, вы сможете получить к нему доступ, перейдя в http://localhost:3000/assets/logo.png.

Если это сработает, но ваш CSS не обновляется, возможно, вам потребуется очистить кеш. Удалите tmp/cache/assetsиз каталога вашего проекта и перезапустите сервер (вебрик и т.д.).

Если это не удается, вы также можете попробовать просто использовать background-image: url(logo.png);Это заставит ваш CSS искать файлы с тем же относительным путем (который в данном случае / assets).

Ник Урбан
источник
2
Просто чтобы ухватиться за это, меня укусило использование двойных кавычек на пути к изображению вместо одинарных. Вы часто используете одинарные кавычки с помощниками ресурсов в файлах css / scss.
d_ethier
я получаю «неопределенную локальную переменную или метод` image '»
Мухаммад Умер
Возможно, вы случайно поставили пробел перед словом изображение?
Ник Урбан,
10

Я только что узнал, что с помощью asset_urlпомощника вы решите эту проблему.

asset_url("backgrounds/pattern.png", image)
Leftis
источник
У меня undefined local variable or method 'image'ошибка.
Пингвин
Может что-то поменяли по рельсам, этот ответ старый! Вы можете попробоватьasset_path("<your_path>", type: :image)
Leftis
8

У меня была аналогичная проблема при попытке добавить фоновое изображение с помощью встроенного CSS. Нет необходимости указывать папку изображений из-за того, как работает синхронизация ресурсов.

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

background-image: url('/assets/image.jpg');
ykwx
источник
Спасибо, я делал assets/img.jpgили ../assets/img.jpgчто явно не работает ни в одном каталоге. /assets/img.jpgделает. TY
ElliotM
5

Rails 4.0.0 будет выглядеть как изображение, определенное image-urlв той же структуре каталогов, что и ваш файл css.

Например, если ваш css в assets/stylesheets/main.css.scss, image-url('logo.png')становится url(/assets/logo.png).

Если вы переместите файл css в assets/stylesheets/cpanel/main.css.scss, image-url('logo.png')станет /assets/cpanel/logo.png.

Если вы хотите использовать изображение непосредственно в каталоге assets / images, вы можете использовать asset-url('logo.png')

Кунтоаджи
источник
5

для таблиц стилей: url (asset_path ('image.jpg'))

user2586863
источник
3
В чем основное различие между url(asset_path('image.jpg'), url('image.jpg')и image-url('image.jpg')? Я работаю с Rails 5.0.0.1 и url()отлично работает в файлах SCSS и в файлах html.erb, которые я использую, asset_path()поэтому я хотел бы знать правильный путь. Заранее спасибо.
alexventuraio
asset_pathдобавить к файлу изображения дайджест-приложение. На самом деле это для производства, после каждого развертывания приложение дайджеста будет изменено, и браузер пользователя загрузит новую версию изображений.
Alex