Railsガイドにきちんと目を通して新しい知識を得る - アセットパイプライン編 -

ドキュメントを読み込むのは大事、ということでRailsガイドを頭から読んでいく取り組みをしています。 各章ごとに、(Railsガイドにちゃんと書いてあるのに)知らなかった機能を雑にまとめていきます。

今回は、アセットパイプラインの章です。

railsguides.jp

Sprocketsの利用法

リンクはこちら

マニフェストファイルとディレクティブ

manifest.jslink_directory ../stylesheets .cssで、app/assets/stylesheetsディレクトリのcssファイルを読み込みます。
実際に、この行を削除するとcssが効かなくなりました。

Railsガイドには、(ただしサブディレクトリは含めません)と記載があったのですが、手元でapp/assets/stylesheets/books/index.csscssファイルを書いたらCSSが反映されます。
これはどうしてだろうと思ったら、app/assets/stylesheets/application.cssに以下の記載がありました。

 *= require_tree .

これによって、ディレクトリ配下のcssファイルを読み込んでいます。
manifast.jslink_directoryを使うことでstylesheet_link_tagapplication.cssが読み込めるようになり、
application.css*= require_tree . とすることでapplication.cssからディレクトリ内のcssが読み込まれるということだと理解しました。

なお、application.cssには以下も記載されていました。

 *= require_self

これは、application.css自身を読み込むタイミングを決めるものです。
例えば*= require_tree .より上に書いた場合、配下のディレクトリ内のcssと対象が重複した場合は配下のcssが適用されます。
逆に、*= require_tree .より下に書いた場合は、application.css`内のcssが適用されます。

Sprocketsにおけるindex.css

例えばapplication.css*= require booksと記述したとき、books/index.cssが存在しないとエラーを返します。

Sprockets::FileNotFound in Books#index

そして、そのindex.css内で *= require_tree .を記載すると、booksディレクトリ内の他のcssファイルを読み込めます。

.css.erb

.css.erbファイルを使うことで、asset_data_uriヘルパーを使ってデータURLスキームを使うこともできるようになります。