2012-01-31 69 views
2

仅使用相关资产我对Rails有点新,目前为止还不错。资产管道/链轮相当整齐,但我有点困惑。当为我的各种控制器生成脚手架时,将单个的css/SCSS文件放入app/assets/stylesheets。但对于我的项目,我使用LESS而不是SCSS,因此我用.css.less文件替换了它们。仅使用Rails 3.2 + Sprockets + 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; 
} 

在没有背景上述结果被应用,甚至给家庭控制器的看法。

回答

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生成一个标记。

+0

如何从application.css中移除'require_tree .',然后在主布局中添加一个'<%= stylesheet_link_tag @current_controller%>'?这样主应用程序的缓存被保留。我只是试了一下,它似乎工作。 – 2012-01-31 19:51:03

+0

是的,我认为require_tree会被删除。 – 2012-01-31 20:00:02