2012-10-10 45 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,如果此帖不能幫助您解決問題。