先日のエントリの最後に書いたprecompileが失敗する問題の続き。
Rails3.2.3でも解決していなかったので本腰入れて調べてみた。


具体的には、rake assets:precompileを実行すると以下のようなエラーで中断する。

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'
以下略

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にするとオプションが不要になる。

胸のつかえが取れたー。

1件のコメント

  1. thanks, I’ve got similar issues

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>