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-url
或asset-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如下:
- 确保您的Gemfile中的开发组具有sass-rails。
-
如果不能解决这个问题,把下面的代码添加到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