Я зрозумів елегантний спосіб, який подобається Рейлам. По-перше, перейменуйте свій .scss
файл у .scss.erb
, а потім використовуйте такий синтаксис (наприклад, для CSS-ресурсу drag_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. Солодке!