2012-02-16 51 views
45

我在3.2.1上,用sass-rails-3.2.4和sass-3.1.15 ...sass-rails帮手“image-url”,“asset-url”在rails中不起作用3.2.1

的资产管道的文件说:

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/AS套/公/ 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'); 
} 

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

+2

您是否曾经为此找到过解决方案? – 2012-03-02 23:58:52

+0

我的项目有2个样式表(一个用于网页,另一个用于应用程序)。我遇到了这个问题,但不是另一个? – Forrest 2012-04-11 23:46:25

回答

30

尽管文档中提到了什么,但似乎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)。这些文档似乎只是对它在后台做什么的解释。

+48

只使用'url(rails.png)'不使用资产文件的指纹版本。在我们的.css.scss文件中,我们需要使用'background:image_url('my-image.png')'。 – dignoe 2013-03-27 05:58:41

+8

如果您需要获取指纹输出,请确保**不**执行此操作:'rake assets:precompile'。您需要设置生产环境,例如'RAILS_ENV =生产耙子资产:预编译',否则它只会生成开发模式的资产链接。 – cdaloisio 2013-11-26 07:10:58

+1

^^那个评论doe !!!节省了我头疼的时间 'RAILS_ENV =生产耙子资产:预编译' – Mutmatt 2015-01-02 04:39:27

4

您是否已启用资产管道application.rb

config.assets.enabled = true 

您在您的萨斯样式表的扩展设置为.css.scss做得对。这让Rails知道在用CSS发布内容之前先用Sass解析文件。

+0

是的..当然。 – patrick 2012-02-16 07:46:34

+0

我在类似的位置创建了一个类似的文件,并获得了正确的输出。你的Gemfile中有没有sass-rails?你可以用'config/environments/development.rb'的内容更新你的原始文章吗? – Brandan 2012-02-16 14:12:43

1

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

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

11

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

尝试添加下面一行到你的application.rb中(或production.rb):

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

我发现修复上this post包括围绕它们添加到预编译器时,文件命名为一个疑难杂症。

0

我们只是有同样的问题,并通过明确要求在Gemfile中链轮(即使它是ActionPack的的依赖)固定它:

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

我不知道为什么,但它现在的作品。 ;-)

+1

明智的感谢,因为 – 2012-07-19 09:59:21

6

如果已经更新您的应用程序过去到Rails 3.1,请务必从

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

改变了你的application.rb中文件

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 

this railscast上升级到Rails 3.1和添加资产管道。

更新: 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) 
+4

一旦你转到Rails 4,你会想回到使用Bundler.require(:default,Rails.env)的旧方式。请参阅http://railscasts.com/episodes/415-upgrading-to-rails-4。 – 2013-07-15 00:52:10

1

我提出由@Ryan建议的变化,以及升级青菜护栏:

bundle update sass-rails 

青菜3.2.6为我工作,而3.2.5没有。

0

我一直在抨击我的头几天。对我而言,唯一的解决方案如下:

  1. 确保您的Gemfile中的开发组具有sass-rails。
  2. 如果不解决这个问题,以下内容添加到在配置/初始化/称为像“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 
    

注:这需要你使用“主动”捆扎机加载机制,即你的application.rb中使用下列内容:

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

...如果你的样式表是供应商,确保他们包含在萨斯的配置:

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

您可以像往常一样向路径添加尾随前斜杠/并使用url

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