我对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;
}
上述结果不会应用任何背景,甚至是家庭控制器的视图。
答案 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呈现标记。