Я нашел элегантный, подобный 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. Классно!