【问题标题】:Ruby on Rails: embedded Ruby not working in imported LESS files?Ruby on Rails:嵌入式 Ruby 在导入的 LESS 文件中不起作用?
【发布时间】:2012-10-10 22:23:27
【问题描述】:

我是第一次使用 LESS 设置 RoR 应用程序,但在某些资产路径上遇到了问题。

无论出于何种原因,当我在使用 @import 引用的 LESS 文件中使用 asset_path()image_path() 引用图像时,只要我在其中包含嵌入式 Ruby 调用,它似乎就会静默地处理导入的 LESS 文件失败。

以下是应用程序的设置方式:

文件系统:

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' 是正在呈现的视图。加载时,它使用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 类未定义,这似乎表明它从未有机会处理我的字体 LESS 文件。

但是,如果我将 &lt;%= asset_path('general/side_shadow.png') %&gt; 替换为文字路径 '/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' 
  • 戴夫

【问题讨论】:

    标签: ruby-on-rails less asset-pipeline


    【解决方案1】:

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

    • 首先,删除我的 .css.less.erb 文件中的 .erb 扩展名(这些扩展名本来就很乱……)
    • 其次,用等效的 CSS/LESS 替换嵌入式 Ruby 调用。

      代替:

      background-image: url(&lt;%= asset_path('general/side_shadow.png') %&gt;);

      改用这个 CSS/LESS 函数:

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

    这在RoR Asset Pipeline guide 中并不清楚,因为它似乎在“CSS 和 ERB”部分建议使用嵌入式 Ruby。但是,“CSS 和 SASS”部分包含对这些函数的适当引用。 (回想起来,SASS 与 LESS 非常相似,因此本指南的这一部分似乎更适用于 LESS。)

    此外,如果这篇文章不能帮助您解决问题,这是similar question 的类似答案。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 2017-10-17
      • 2012-01-16
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2011-05-23
      相关资源
      最近更新 更多