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

Враздел 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) директивы приводят к необнаруженным изображениям.

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

Ответы на вопрос(8)

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

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

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

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

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

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

<%= 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 (который гораздо менее хрупок, чем жесткое кодирование) должен работать. Я основал это наподобная техника Я видел для таблиц стилей,

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

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

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

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

 11 июл. 2012 г., 02:24
Вы очищаете кеши (особенно браузер и RAILS_ROOT / tmp / cache) между тестами?
 chadoh11 июл. 2012 г., 21:16
После каждого изменения кода я быrake tmp:cache:clear && rm -r .sass-cache/* и затем cmd + shift-R в Chrome (который не зависит от кеша).
 17 июл. 2013 г., 19:15
Я обновил до sass-rails 3.1.4 и очистилtmp/cache и .sass-кеш.image-path а такжеurl-path оба ошибочно ссылались на / images вместо / assets. Я протестировал ресурсы: прекомпилировал в моей среде разработки и, несмотря на то, что все еще загружал отдельные файлы (без сжатия), путь изменился на правильный / assets. Затем я подтолкнул к постановке, и все работало отлично. Потом после бегаrake assets:clean В процессе разработки, чтобы вернуться к правильной среде разработки, полученный css по-прежнему ссылается на / assets. Я понятия не имею, почему это сработало.
 chadoh10 июл. 2012 г., 22:57
Это сработало в первый раз, когда я попробовал это, поэтому мое возмущение привело к тому, что вы получили половину моей первоначальной награды. Тем не менее, казалось, что я сделал что-то еще, потому что вернуться к исходной версии 3.1.0 продолжал работать. Я повторил сегодня (пару недель спустя) и sass-rails 3.1.4 больше не работает. Обновление Rails и sass-rails до версии 3.1.6 также не выполняется. Я могу попробовать обновить до 3.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;

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

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

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

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

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

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

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

Ваш ответ на вопрос