Вопрос по sass, ruby-on-rails, compass-sass, asset-pipeline – конвейер ресурсов sass-rails: неправильная генерация путей к изображениям; `url (/images/blah.png)` вместо `url (/assets/blah.png)`

17

Враздел 2.2.2, «CSS и Sass»;Мне сказали поставитьimage-url('delete.png') по моему И так у меня есть.

Тем не менее, он генерирует CSS как

background-image: url(/images/delete.png)

вместо того, что мне везде говорят, что оно должно генерировать, правильное и очевидное,

background-image: url(/assets/delete.png)

Какие. Черт.

Я провел буквальные дни, пытаясь выяснить, откуда это исходит.

Здесь & APOS; sСуть соответствующих настроек что приводит к такому поведению. Здесь & APOS; sсуть тех же файлов в более ранней версии нашей кодовой базы (сразу после того, как мы внедрили конвейер активов, и он фактически работал около недели, пока не появилось это разочаровывающее поведение). Можете ли вы определить различия? Любые другие файлы, о которых вы можете подумать, могут быть причиной этого?

Note We're purposely using an older version of sass-rails because a newer version was causing Stack level too deep! errors when precompiling. We're using Compass. Two hackish attempts at workarounds

Потому что на самом деле поиск и устранение неисправностей в конвейере активов отстой.

1: Put images in /images

Я попытался просто переместить все изображения вpublic/images и добавьте это как путь загрузки. Это работает в Dev (изображения доступны на/assets или же/images), но предварительная компиляция для производства помещает отпечатанные изображения в/assets только (obvs), поэтому когда sass-rails вставляетurl(/imagse/delete-120398471029384102364.png), это не может быть найдено.

2: Make /public/images a symlink to /public/assets

Это, вероятно, будет работать на производстве, но в процессе разработки папка / assets не существует, поэтомуurl(/images/delete.png) директивы приводят к необнаруженным изображениям.

Вы пробовали следующее:asset_path 'delete.png' ? ccyrille
Как насчет использования файла .sass.erb и использования & lt;% = asset_path ("delete.png")% & gt ;? Хотя это все еще обходной путь, возможно, стоит попытаться диагностировать, является ли sass-rails неисправным или нет. Chris
Это было быasset-url('delete.png', image), Да, я попробовал это. Как можно было бы надеяться,image-url('delete.png') это просто сокращение для этого. У них точно такое же поведение. chadoh

Ваш Ответ

8   ответов
0

если вы открыты для использования спрайтинга по компасу, вы сократите число запросов http и сможете вручную указать путь к изображению с помощью карты спрайтов, т. Е. $ спрайты: sprite-map ("PATH / *. png");

Интересная мысль; Похоже, что Compass все равно (через sass) создаст "/ images" Директива для этого, а не правильный "/ assets", хотя. chadoh
Ах, ты прав. Я забыл включить необходимый флаг относительного пути в файл ресурсов в моем описании. c.relative_assets = true
8

это связано с вашей версией sass-rails (3.1.0). Я могу воспроизвести вашу проблему (спасибо за размещение Gemfile), и она исчезнет при столкновении с sass-rails 3.1.4.

Попробуйте обновить до 3.1.4 и очиститьtmp/cache, Также убедитесь, что вы не используете кеш браузера.

Я знаю, что вы сказали, что 3.1.4 вызывает другие проблемы ... Вы пробовали более высокие версии?

После каждого изменения кода я быrake tmp:cache:clear && rm -r .sass-cache/* и затем cmd + shift-R в Chrome (который не зависит от кеша). chadoh
Вы очищаете кеши (особенно браузер и RAILS_ROOT / tmp / cache) между тестами?
Это сработало в первый раз, когда я попробовал это, поэтому мое возмущение привело к тому, что вы получили половину моей первоначальной награды. Тем не менее, казалось, что я сделал что-то еще, потому что вернуться к исходной версии 3.1.0 продолжал работать. Я повторил сегодня (пару недель спустя) и sass-rails 3.1.4 больше не работает. Обновление Rails и sass-rails до версии 3.1.6 также не выполняется. Я могу попробовать обновить до 3.2, но это много работы. chadoh
Я обновил до sass-rails 3.1.4 и очистилtmp/cache и .sass-кеш.image-path а такжеurl-path оба ошибочно ссылались на / images вместо / assets. Я протестировал ресурсы: прекомпилировал в моей среде разработки и, несмотря на то, что все еще загружал отдельные файлы (без сжатия), путь изменился на правильный / assets. Затем я подтолкнул к постановке, и все работало отлично. Потом после бегаrake assets:clean В процессе разработки, чтобы вернуться к правильной среде разработки, полученный css по-прежнему ссылается на / assets. Я понятия не имею, почему это сработало.
2

компаса и рельсов сасса. Мы работаем на рельсах 3.2.6. Это хорошо сработало для нас.

gem "compass", git: "git: //github.com/chriseppstein/compass.git&apos ;, ref:" 3a4c5c75dca9f07f6edf2f0898a4626269e0ed62 & ap;

gem "haml-rails", git: "git: //github.com/indirect/haml-rails.git&apos ;, ref:" 92c41db61f20a9f122de25bc73e5045cfccdbcd5 ';

gem 'sass-rails'; '' & gt; 3.2.5 & APOS;

-2

как я отредактировал свой файл .scss (добавил пробел) и перезагрузил страницу, я получил правильный результат. , как я удалил пространство, оно работало правильно.

10

*.css.scss (в отличие от.sass - если вы сделаете это, вам может понадобиться скорректировать синтаксис некоторых операторов). Затем используйтеimage_path помощник вместоimage-pathНапример:

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

Я ожидаю, что это решит вашу проблему. Если это не так, каков путь активов, созданный этим подходом для вас?

Это не работает (если только я не предпринимаю соответствующего шага, что возможно; тогда я внесу изменениеrake tmp:cache:clear && rm -r .sass-cache/* а затем cmd + shift-R страницу в Chrome, чтобы все активы вернулись со статусом 200 вместо 202 Неизмененные & # x2014; должно ли это работать?). Он дает те же результаты, что и раньше (с возвращением «/ images» вместо «/ assets»). Я даже не видел этот синтаксис ни в одной документации. Почему бы и нетimage-url? chadoh
0

что он находится в одном из каталогов, перечисленных здесь:

<%= debug Rails.application.config.assets.paths %>

Затем проверьте, по какому относительному пути компас ожидает найти изображение (и посмотрите, соответствует ли оно.Compass config docsодин из них должен сказать вам:

<%= debug config.compass.http_images_path %>
<%= debug config.compass.http_generated_images_path %>

Я предполагаю, что это первый. В любом случае, сравните их путь с asset_path вашего изображения:

<%= debug asset_path 'delete.png' %>

Если пути не совпадают, возможно, вам нужно настроить путь в вашей конфигурации среды (development.rb, ...), например, так:

config.compass.http_images_path = '/assets.

В качестве альтернативы, вы можете переместить изображение туда, где http_images_path или http_generated_images_path ожидают его найти.

На данный момент, можно надеяться, что asset_path / asset_url (который гораздо менее хрупок, чем жесткое кодирование) должен работать. Я основал это наподобная техника Я видел для таблиц стилей,

Спасибо! Это все выглядит хорошо, хотя.asset_path а такжеimage_path помощники работают в erb / haml. Это(asset|image)-(path|url) помощники в sass, которые не работают. chadoh
2

https://github.com/rails/sass-rails/issues/57 Если это так, вы должны попытаться найти хорошее сочетание версий между Compass и Sass-rails.

И, возможно, обновить все (включая Rails) до последних версий, это по-прежнему лучший способ сделать (использоватьbundle outdated команда в bundler 1.2, чтобы узнать, что Gems для обновления)

Спасибо за ссылку на ошибку, хотя. Похоже, что это все еще поражает многих людей (много комментариев после закрытия, говорящих, что это все еще происходит). chadoh
& quot; Попробуйте найти хорошее сочетание версий между Compass и Sass-rails & quot ;. Потрясающие. Я люблю такие решения. & quot; Поместить в две случайные версии,bundle update, rake tmp:cache:clearи сдвиньте и обновите браузер. & quot; Это то, что я делал, прежде чем я спросил на SO. Это отстой. chadoh
0

измененияimage_path вimage-path работал на.scss, Позже я изменился наimage_path и теперь он работает нормально.

Удаление кеша мне не помогло.

Похожие вопросы