yuuna log's 5th edition.

旅の召還士の記録。

Rails3.1.0 + rails_adminでassets:precompileをすると失敗する

先日の某クラウドの大崩落があって急遽ECにサーバーをうつしたのですが、assets:precompile中にどうやってもエラーを吐いてとまってしまいます

$ rake assets:precompile
(略)
rake aborted!
stack level too deep
  (in /Users/xxxxx/.rvm/gems/ruby-1.9.2-p290/bundler/gems/rails_admin-1e2984414293/app/assets/stylesheets/rails_admin/imports.css.scss.erb)

--traceしても-vしてもなにもでないので、原因を追ってたんだけど不明(´Д`;)
Railsを3.1系のstableにすると、今度はhamljpmobile周りでエラーをだすという踏んだりけったり状態。

結局saas-railsが3.1.6だとアウトだというところにたどり着くのにまるまる1日かかりました(´Д`;)
Gemfileの該当箇所をバージョン固定にしてとりあえず回避できました。

  gem 'sass-rails', "3.1.5"

 (´Д`;)

で、興味本位で原因を追ってみると

https://github.com/rails/sass-rails/commit/0b435834bc37e26c016f2d29885ca3bfe08ae827#lib/sass/rails/template_handlers.rb

-------------------- lib/sass/rails/template_handlers.rb ---------------------
index 1b3b31e..2350476 100644
@@ -19,7 +19,7 @@ module Sass::Rails
       nil
     end
 
-    def public_path(path, scope)
+    def public_path(path, scope = nil)
       context.asset_paths.compute_public_path(path, ::Rails.application.config.assets.prefix)
     end
 
@@ -72,14 +72,17 @@ module Sass::Rails
       options = sass_options_from_rails(scope)
       load_paths = (options[:load_paths] || []).dup
       load_paths.unshift(importer)
+      resolver = Resolver.new(scope)
+      css_filename = File.join(::Rails.public_path, resolver.public_path(scope.logical_path)) + ".css"
       options.merge(
         :filename => eval_file,
+        :css_filename => css_filename,
         :line => line,
         :syntax => syntax,
         :importer => importer,
         :load_paths => load_paths,
         :custom => {
-          :resolver => Resolver.new(scope)
+          :resolver => resolver
         }
       )
     end

これが原因か……