我对 Rails 有点陌生,到目前为止还不错。 Assets 管道/sprockets 非常整洁,但我有点困惑。当为我的各种 Controller 生成脚手架时,单独的 css/SCSS 文件被放入 app/assets/stylesheets 中。但对于我的项目,我使用的是 LESS 而不是 SCSS,因此我用 .css.less 文件替换了它们。
我遇到的问题是,如果我将 CSS 添加到 Controller (例如,我们称之为“home.css.less”),它会包含在每个 View 中,而不仅仅是属于“home”的 View Controller 。如果我删除“*= require_tree”。来自 application.css 文件,则该文件不包含在任何 View 中。
如何使用 Rails Assets 管道为特定 Controller / View 指定 CSS 代码?
应用程序.css:
/*
*= require twitter/bootstrap
*= require_self
*= require "application_custom"
*/
home.css.less:
body {
background: asset-url("circles.png") no-repeat;
}
上述结果不会应用背景,即使是家庭 Controller 的 View 也是如此。
最佳答案
这是一个相当常见的请求;许多网站都有主页特定的 CSS,他们不希望将其应用到整个网站。
如果可以的话,在提供解决方案之前我会对此发表一些评论。
管道的目的是向客户端呈现一个 CSS(和一个 JS)文件。添加摘要是为了允许添加服务器 header ,强制远程客户端在本地缓存中保留它们的副本。
出于性能原因,单个请求和主动缓存策略是 Rails 的默认策略;每个请求都会减慢页面速度。
除非主页 CSS 非常广泛,否则我建议使用默认行为。如果想要将其分开是由于主页和其他页面之间 CSS 选择器的冲突,我建议更改 CSS 结构来解决这个问题。
至少有两种常见的解决方案:
如果您想为每个 Controller 手动使用不同的文件,则将使用第一个。
<%= stylesheet_link_tag "application", controller_name %>
要使其在生产中发挥作用,您必须告诉 Rails 预编译所有单独的 CSS 文件(在 application.rb 中):
config.assets.precompile << '*.css'
第二个是添加一个助手,仅在 View 需要时才渲染 CSS。
我推荐this question上的顶级解决方案。您必须修改 CSS 的帮助程序名称。仅当在 View 中设置时,才会呈现所需 CSS 的标签。
关于asset-pipeline - 仅使用 Rails 3.2 + Sprockets + LESS 的相关资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9074745/