仅使用Rails 3.2 + Sprockets + LESS的相关资产

时间:2012-01-31 05:12:49

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

我对Rails有点新意,到目前为止一切顺利。资产管道/链轮非常整洁,但我有点困惑。为我的各种控制器生成脚手架时,将各个css / SCSS文件放入app / assets / stylesheets。但对于我的项目,我使用LESS而不是SCSS,所以我用.css.less文件替换它们。

我遇到的问题是,如果我将CSS添加到控制器(例如,我们将其称为“home.css.less”),它将包含在每个视图中,而不仅仅是属于“home”的视图控制器。如果我删除“* = require_tree”。从application.css文件中,该文件不包含在任何视图中。

如何使用Rails资产管道为特定控制器/视图指定CSS代码?

application.css:

/*
  *= require twitter/bootstrap
  *= require_self
  *= require "application_custom"
*/

home.css.less:

body {
  background: asset-url("circles.png") no-repeat;
}

上述结果不会应用任何背景,甚至是家庭控制器的视图。

1 个答案:

答案 0 :(得分:3)

这是一个相当普遍的要求;许多网站都有主页特定的CSS,他们不希望在整个网站上应用它们。

如果可能的话,我会在提供解决方案之前就此提出一些意见。

管道向客户端呈现一个CSS(和一个JS)文件的目的。添加摘要以允许添加服务器标头,强制远程客户端将它们的副本保留在其本地缓存中。

出于性能原因,单个请求和积极缓存策略是Rails的默认策略;每个请求都会减慢页面的速度。

除非主页CSS非常广泛,否则我建议使用默认行为。如果想要将其分解出来是因为家庭页面和其他页面之间的CSS选择器发生了冲突,我建议将CSS结构更改为完成。

至少有两种常见的解决方案:

如果您想为每个控制器手动设置不同的文件,则会使用第一个文件。

<%= stylesheet_link_tag "application", controller_name %>

为了在生产中工作,你必须告诉rails预编译所有单独的CSS文件(在application.rb中):

config.assets.precompile << '*.css'

第二种是仅在视图中需要时才添加帮助器来渲染CSS。

我推荐this question上的顶级解决方案。您将不得不修改CSS的帮助程序名称。只有在视图中设置时,才会为所需的CSS呈现标记。