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

我在3.2.1上,用sass-rails-3.2.4和sass-3.1.15 …

资产pipe道的文档说:

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') 

当我访问本地主机: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'); } 

但得到相同的结果…有没有人有任何想法为什么这些助手不工作?

尽pipe文档说了什么,似乎rails 3.2.6中的默认选项允许你在CSS中使用更less的path信息。 例如../app/assetshttp://img.dovov.comrails.png是你的example.css.scss文件中的引用,如下所示:

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

你不包括image-urlasset-url到你的scss(据我所知),只是简单的url(your_image.png) 。 这些文件似乎只是对它在后台做什么的解释。

当我遇到这个问题时,这是因为我没有将CSS文件包含在资产pipe道中进行预编译。 因此,它将在运行时生成。 由于sass-rails gem通常位于:assets组中,因此在运行时生成css文件时帮助器不可用。

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

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

我在这篇文章中发现了一个修正,包括在将文件添加到预编译器时对文件进行命名的问题。

如果您以前已将应用程序更新到Rails 3.1,请确保已将您的application.rb文件从中更改

 # If you have a Gemfile, require the gems listed there, including any gems # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) if defined?(Bundler) 

 if defined?(Bundler) # If you precompile assets before deploying to production, use this line Bundler.require *Rails.groups(:assets => %w(development test)) # If you want your assets lazily compiled in production, use this line # Bundler.require(:default, :assets, Rails.env) end 

看到升级到Rails 3.1和添加资产pipe道的这个railscast 。

更新: Rails 4可以回到旧的方式。 谢谢Aaron Gray

 # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) 

你有没有在application.rb启用资产pipe道?

 config.assets.enabled = true 

你做了正确的扩展你的萨斯样式表.css.scss 。 这让Rails知道用Sassparsing文件,然后将内容作为CSS发布。

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

顺便说一句,尽pipe事实上我可以看到其他的Sass指令,例如设置variables和计算它们,正在执行的这个工作。 我确定有一个非常简单的解释,一旦我有时间追查下来。

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

 bundle update sass-rails 

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

我们只是遇到同样的问题,通过明确地要求Gemfile中的链轮(即使它是ActionPack的依赖)来解决它:

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

我不知道为什么,但它现在起作用。 😉

几天来,我一直在抨击我的头脑。 为我工作的唯一解决scheme如下:

  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 

注意:这要求您使用“主动”Bundler加载机制,即您的application.rb使用以下内容:

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

…如果您的样式表位于供应商中,请确保它们包含在Sass的configuration中:

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