Я нашел элегантный Rails-подобный способ сделать это. Сначала переименуйте ваш .scss
файл в .scss.erb
, затем используйте синтаксис, подобный этому (пример для CSS-ресурса highlight_js-rails4 gem ):
@import "<%= asset_path("highlight_js/github") %>";
Почему вы не можете разместить файл напрямую через SCSS :
Выполнение @import
операции в SCSS прекрасно работает с файлами CSS, если вы явно используете полный путь тем или иным способом. В режиме разработки rails s
обслуживает ресурсы без их компиляции, поэтому такой путь работает ...
@import "highlight_js/github.css";
... потому что пройденный путь буквально /assets/highlight_js/github.css
. Если вы щелкнете правой кнопкой мыши на странице и «просмотрите исходный код», а затем нажмите на ссылку для таблицы стилей с приведенным выше описанием @import
, вы увидите там строку, которая выглядит следующим образом:
@import url(highlight_js/github.css);
Двигатель SCSS переводится "highlight_js/github.css"
как url(highlight_js/github.css)
. Это будет работать без сбоев, пока вы не решите попробовать запустить его в рабочей среде, где предварительно скомпилированные ресурсы имеют хеш-код, введенный в имя файла. Файл SCSS по-прежнему преобразуется в статический, /assets/highlight_js/github.css
который не был предварительно скомпилирован и не существует в рабочей среде .
Как работает это решение:
Во-первых, переместив .scss
файл в .scss.erb
, мы фактически превратили SCSS в шаблон для Rails. Теперь всякий раз, когда мы используем <%= ... %>
теги шаблонов, процессор шаблонов Rails заменяет эти фрагменты выводом кода (как и любой другой шаблон).
Указание asset_path("highlight_js/github")
в .scss.erb
файле делает две вещи:
- Запускает
rake assets:precompile
задачу для прекомпиляции соответствующего файла CSS.
- Создает URL, который надлежащим образом отражает актив независимо от среды Rails.
Это также означает, что механизм SCSS даже не анализирует файл CSS; это просто размещение ссылки на него! Так что нет никаких патчей обезьяны или грубых обходных путей. Мы обслуживаем актив CSS через SCSS, как предполагалось, и используем URL для указанного актива CSS, как и предполагалось Rails. Сладкий!