Saya menemukan cara Rails yang elegan untuk melakukannya. Pertama, ganti nama .scss
file Anda .scss.erb
, kemudian gunakan sintaks seperti ini (contoh untuk highlight_js-rails4 gem CSS aset ):
@import "<%= asset_path("highlight_js/github") %>";
Mengapa Anda tidak dapat meng-host file secara langsung melalui SCSS :
Melakukan @import
dalam SCSS berfungsi dengan baik untuk file CSS selama Anda secara eksplisit menggunakan path lengkap dengan satu atau lain cara. Dalam mode pengembangan, rails s
melayani aset tanpa mengompilasinya, jadi jalur seperti ini berfungsi ...
@import "highlight_js/github.css";
... karena jalur yang di-host secara harfiah /assets/highlight_js/github.css
. Jika Anda mengklik kanan pada halaman dan "melihat sumber", lalu klik pada tautan untuk stylesheet dengan yang di atas @import
, Anda akan melihat garis di sana yang terlihat seperti:
@import url(highlight_js/github.css);
Mesin SCSS diterjemahkan "highlight_js/github.css"
menjadi url(highlight_js/github.css)
. Ini akan bekerja dengan baik sampai Anda memutuskan untuk mencoba menjalankannya di produksi di mana aset dikompilasi memiliki hash yang disuntikkan ke nama file. File SCSS masih akan menyelesaikan ke statis /assets/highlight_js/github.css
yang tidak dikompilasi dan tidak ada dalam produksi.
Bagaimana solusi ini bekerja:
Pertama, dengan memindahkan .scss
file ke .scss.erb
, kami telah secara efektif mengubah SCSS menjadi templat untuk Rails. Sekarang, setiap kali kita menggunakan <%= ... %>
tag templat, prosesor templat Rails akan mengganti snippet ini dengan output kode (sama seperti templat lainnya).
Menyatakan asset_path("highlight_js/github")
dalam .scss.erb
file melakukan dua hal:
- Memicu
rake assets:precompile
tugas untuk mengkompilasi file CSS yang sesuai.
- Menghasilkan URL yang mencerminkan aset dengan tepat terlepas dari lingkungan Rails.
Ini juga berarti bahwa mesin SCSS bahkan tidak mem-parsing file CSS; itu hanya menampung tautan! Jadi tidak ada patch monyet tipu atau solusi kotor. Kami melayani aset CSS melalui SCSS sebagaimana dimaksud, dan menggunakan URL untuk mengatakan aset CSS sebagai Rails dimaksudkan. Manis!