2

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

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

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

应用程序.css:

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

home.css.less:

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

以上结果没有应用背景,即使是家庭控制器的视图。

4

1 回答 1

3

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

如果可以的话,我会在提供解决方案之前对此发表一些评论。

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

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

除非主页 CSS 非常广泛,否则我建议使用默认行为。如果想要将其拆分出来是因为主页和其他页面之间的 CSS 选择器冲突,我建议更改 CSS 结构来克服这个问题。

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

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

<%= stylesheet_link_tag "application", controller_name %>

为此,您必须告诉 rails 预编译所有单独的 CSS 文件(在 application.rb 中):

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

第二个是添加一个助手来仅在视图需要时渲染 CSS。

我推荐这个问题的最佳解决方案。您将不得不修改 CSS 的助手名称。只有当它在视图中设置时,它才会为所需的 CSS 渲染一个标签。

于 2012-01-31T18:15:53.040 回答