compass-rails 无法使用 sprite-dimensions mixin 将 nil 转换为 String

compass-rails got can't convert nil into String using sprite-dimensions mixin

在我的 rails 3.2 应用程序中,使用 compass 0.12.7rails-compass 2.0.0 生成精灵。图标目录是 [root]/public/img/marketings/icons[root]/public/img/marketings/icons-retina

由于图像目录不是指南针的默认图像目录,在config/initializers

中添加了一个compass_config.rb
options = {
  :sprite_load_path => Compass.configuration.sprite_load_path + ["#{Rails.root}/public/img"],
  :images_dir => "public/img",
  :images_path => "#{Rails.root}/public/img",
  :generated_images_dir => "public/img",
  :generated_images_path => "#{Rails.root}/public/img"
}
Compass.add_configuration(options, "sprites")

写了一个自定义的 sass 文件:

$sprites: sprite-map("marketings/icons/*.png");
$sprites-url: sprite-url($sprites);
$sprites2x: sprite-map("marketings/icons-retina/*.png");
$sprites2x-url: sprite-url($sprites2x);

// some more codes....

@mixin retina-sprite($name, $sprites, $sprites-url, $sprites2x, $sprites2x-url, $dimensions: true, $pad: 0) {
  @if $dimensions == true {
    @include sprite-dimensions($sprites, $name);
  }

  background-image: $sprites-url;
  background-position: sprite-position($sprites, $name, -$pad, -$pad);
  background-repeat: no-repeat;

  @if $pad > 0 {
    padding: $pad;
  }

  @include hidpi(1.5) {
    $pos: sprite-position($sprites2x, $name, -$pad*2, -$pad*2);
    background-image: $sprites2x-url;
    background-position: nth($pos, 1) nth($pos, 2)/2;
    @include background-size(ceil(image-width(sprite-path($sprites2x)) / 2), auto);
  }
}

精灵图像已正确生成,但在 @include sprite-dimensions($sprites, $name)@include background-size(ceil(image-width(sprite-path($sprites2x)) / 2), auto)

行中出现“无法将 nil 转换为字符串”错误

如果将图标目录移动到 app/assets/images 并删除 compass_config.rb,它工作正常。但是由于某些历史原因,图标必须位于 public/img 目录中。我的 compass_config.rb 有问题吗?

查看 compass 和 rails-compass 源代码后,发现 rails-compass 覆盖了导致问题的两个方法 https://github.com/Compass/compass-rails/blob/master/lib/compass-rails/patches/compass.rb and https://github.com/Compass/compass-rails/blob/master/lib/compass-rails/patches/3_1.rb。要解决这个问题,就我而言,必须把 [root]/public 目录下的 icons 和 icons-retina 文件夹