sass-rails helpers“image-url”,“asset-url”在rails 3.2.1中不起作用

时间:2012-02-16 02:20:23

标签: ruby-on-rails ruby-on-rails-3 sass asset-pipeline

我在3.2.1,sass-rails-3.2.4和sass-3.1.15 ...

资产管道的文档说:

asset-url("rails.png", image) becomes url(/assets/rails.png)
image-url("rails.png") becomes url(/assets/rails.png)

...

所以我做了以下文件:

# app/assets/stylesheets/public/omg.css.sass

body
  background: asset-url('snake.gif', image)

#lol
  background: image-url('snake.gif')

当我访问localhost:3000 / assets / public / omg.css时,我得到:

body {
  background: asset-url("snake.gif", image); }

#lol {
  background: image-url("snake.gif"); }

...我也尝试将文件更改为omg.css.scss并将语法更改为:

# app/assets/stylesheets/public/omg.css.scss

body {
  background: asset-url('snake.gif', image);
}

#lol {
  background: image-url('snake.gif');
}

但得到相同的结果......有没有人知道为什么这些助手不起作用?

8 个答案:

答案 0 :(得分:33)

尽管文档说的是,但似乎rails 3.2.6中的默认选项允许您在CSS中使用更少的路径信息。 例如。 ../app/assets/images/rails.png是example.css.scss文件中的引用,类似于:

background: white url(rails.png) repeat-y;

您不会将image-urlasset-url包含在您的scss中(据我所知),只是简单url(your_image.png)。这些文档似乎只是对后台工作的解释。

答案 1 :(得分:11)

当我遇到这个问题时,那是因为我没有在资产管道中包含css文件以进行预编译。结果,它将在运行时生成。因为sass-rails gem通常位于:assets组中,所以在运行时生成css文件时助手不可用。

尝试将以下行添加到application.rb(或production.rb):

config.assets.precompile += %w( public/omg.css )

我在this post上找到了修复程序,包括在将文件添加到预编译器时命名文件的问题。

答案 2 :(得分:4)

您是否在application.rb

中启用了资产管道
config.assets.enabled = true

通过将Sass样式表的扩展名设置为.css.scss,您做得很好。这让Rails知道在用CSS发送内容之前先用Sass解析文件。

答案 3 :(得分:1)

您可能想尝试清除/ tmp / cache。我对Rails和Sass来说太新了,不知道为什么会这样,但是经过几个小时的搜索,它解决了我同样的问题。

顺便说一句,尽管事实上我可以看到其他Sass指令,例如设置变量和使用它们进行计算,但仍然可以执行。我确定有一个非常简单的解释,一旦我有时间追踪它。

答案 4 :(得分:1)

我做了@Ryan建议的更改,以及升级sass-rails:

bundle update sass-rails

sass 3.2.6为我工作,而3.2.5没有。

答案 5 :(得分:0)

我们遇到了同样的问题并通过明确要求Gemfile中的sprockets来修复它(即使它是ActionPack的依赖项):

group :assets do
  gem 'sprockets'
  gem 'sass-rails', '~> 3.2.3'
  # ...
end

我不知道为什么,但它现在有效。 ; - )

答案 6 :(得分:0)

我几天来一直在抨击我。对我有用的唯一解决方案如下:

  1. 确保您的Gemfile中的开发组使用sass-rails。
  2. 如果不能解决问题,请将以下内容添加到config / initializers /中的新文件中,称为“horrible_sass_patch.rb”:

    begin
      require 'sass-rails'
    rescue
    end
    
    if Class.const_defined? "Sass::Script::Functions"
      module Sass::Script::Functions
        # This function exists, but doesn't automatically register
        declare :asset_url, [:value]
        declare :image_url, [:value]
        declare :font_url, [:value]
        # ... etc
      end
    end
    
  3. 注意:这要求您使用“活动”Bundler加载机制,即您的application.rb使用以下内容:

    Bundler.require *Rails.groups(:assets => %w(development test))
    

    ...如果您的样式表在供应商中,请确保它们包含在Sass的配置中:

    if config.respond_to? :sass
      config.sass.load_paths << Rails.root.join('vendor', 'assets', 'stylesheets')
    end
    

答案 7 :(得分:-1)

您只需在路径中添加一个向前的斜杠/,然后像往常一样使用url

background-image: url("/assets/rails.png")