続々assets:precompile問題
先日のエントリの最後に書いたprecompileが失敗する問題の続き。 Rails3.2.3でも解決していなかったので本腰入れて調べてみた。
具体的には、rake assets:precompileを実行すると以下のようなエラーで中断する。
[text]
rake aborted!
undefined method []' for nil:NilClass
(in /path/to/rails_app/app/assets/stylesheets/application.css)
/path/to/.rvm/gems/ruby-1.9.3-p125/gems/sass-rails-3.2.5/lib/sass/rails/helpers.rb:32:in
resolver’
/path/to/.rvm/gems/ruby-1.9.3-p125/gems/sass-rails-3.2.5/lib/sass/rails/helpers.rb:22:in image_path'
/path/to/.rvm/gems/ruby-1.9.3-p125/gems/sass-3.1.15/lib/sass/script/funcall.rb:88:in
_perform’
以下略
[/text]
railsをstableにすると発生しなくなったり3.2.3で復活したり長らく原因不明だったが、githubのこのissueを追っかけてようやく原因が分かった。
cssのurlをassetsに対応させるため、erbを埋め込んで以下のようにしていた。
これはprecompileしない環境(development)だとうまく行くが、assets:precompileを実行すると上記のエラーになる。 どうやらasset_pathヘルパが[:custom]オプションを要求するのに対し、sassエンジンが[:custom]オプションなしで初期化されるのが原因らしい。 erbのasset_pathを諦め、styles.css.scssにリネームした上で、以下のように書き換えて解決。
asset_pathがsassではasset-pathになるのが分からなくてハマった。RailsGuideに書いてはあるんだけど例が分かりづらい。 sprocketのドキュメントの方が分かりやすいかも。 なお、asset-pathだとimageオプションが必要だが、文字列を生で書くのが気持ち悪い場合、image-pathにするとオプションが不要になる。
胸のつかえが取れたー。