2012-10-10 52 views
2

我第一次使用LESS设置了RoR应用程序,并且遇到了一些资产路径问题。Ruby on Rails:嵌入式Ruby无法在导入的LESS文件中工作?

无论出于何种原因,当我在使用@import引用的LESS文件中引用使用asset_path()image_path()或图像,这似乎默默地失效处理导入的LESS文件每当我包括在它的一个嵌入的Ruby呼叫。

这里的应用程序是如何设置:

文件系统:

views 
-> home 
app 
-> assets 
    -> images 
     -> general 
      -> side_shadow.png 
     -> home 
      -> chair.png 
    -> stylesheets 
     -> less 
      -> home.css.less.erb 
      -> template.css.less.erb 
      -> style.css.less.erb 
      -> fonts.css.less.erb 
public 
-> assets 
    -> general 
     -> side_shadow.png 
    -> home 
     -> chair.png 

在我的应用程序, '家' 所呈现的视图。当它加载,它采用home.css.less.erb

@import url("template.css.less.erb"); 

div#holder 
{ 
    background: url(<%= asset_path('home/chair.png')%>); 
    /* This resolves appropriately as /assets/home/chair.png... */ 
} 
... 

然后加载template.css.less.erb

@import url("style.css.less.erb"); 

... 

并最终加载style.css.less.erb

@import url("fonts.css.less.erb"); 

body 
{ 
    background-image: url(<%= asset_path('general/side_shadow.png') %>); 
} 
... 

当我运行使用rake assets:precompile这一点,中止,通知我在我的fonts.css.less.erb文件中定义的CSS类未定义,这似乎表明它从来没有机会处理我的fo nts LESS文件。

但是,如果我将<%= asset_path('general/side_shadow.png') %>替换为文字路径'/assets/general/side_shadow.png',它将无一例外地继续并且页面按预期加载。

为什么LESS文件(这是由另一个LESS文件导入的)包含此嵌入式Ruby调用?我可以在根文件home.css.less.erb上没有问题的情况下执行它,但不能在它引用的任何LESS文件中执行。

我的Gemfile:

source 'https://rubygems.org' 

gem 'rails', '3.2.8' 

# Bundle edge Rails instead: 
# gem 'rails', :git => 'git://github.com/rails/rails.git' 

gem 'sqlite3' 

# Gems used only for assets and not required 
# in production environments by default. 
group :assets do 
    gem 'sass-rails' #, '~> 3.2.3' 
    gem 'coffee-rails' #, '~> 3.2.1' 
    gem 'less-rails' 
    gem 'less-rails-bootstrap' 

    # See https://github.com/sstephenson/execjs#readme for more supported runtimes 
    gem 'therubyracer', :platforms => :ruby 

    gem 'uglifier' #, '>= 1.0.3' 
end 

gem 'jquery-rails' 

# To use ActiveModel has_secure_password 
# gem 'bcrypt-ruby', '~> 3.0.0' 

# To use Jbuilder templates for JSON 
# gem 'jbuilder' 

# Use unicorn as the app server 
# gem 'unicorn' 

# Deploy with Capistrano 
# gem 'capistrano' 

# To use debugger 
# gem 'debugger' 
  • 戴夫

回答

3

原来我这个错误的方式追求;我不需要使用嵌入式Ruby来构建资产路径,因为嵌入在CSS/LESS中的函数允许我在不使用Ruby的情况下构建资产路径。这意味着两件事情:

  • 首先,删除.erb扩展到我的.css.less.erb文件(这些扩展乱反正...)
  • 二,更换嵌入的Ruby调用带有CSS/LESS等同。

    相反的:

    background-image: url(<%= asset_path('general/side_shadow.png') %>);

    使用此CSS/LESS函数:

    background-image: image-url("general/side_shadow.png");

这是不明确的RoR Asset Pipeline guide,因为它似乎在暗示将使用嵌入Ruby的“CSS & ERB”部分。但是,“CSS S& SASS”部分包含对这些功能的适当引用。 (回想起来,SASS与LESS相当接近,因此本指南的这一部分似乎更适用于LESS。)

此外,这是一个similar question,如果此帖不能帮助您解决问题。