asset-pipeline - 仅使用 Rails 3.2 + Sprockets + LESS 的相关资源

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

我对 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/

相关文章:

javascript - Rails 4 : "//= require_tree ." in application. js 不包含我的 js 文件在/app/assets/javascripts

javascript - 动态加载 less.js 规则

css - 您如何根据其背后图像的颜色将后退按钮图标的字体颜色设置为白色或黑色?

ruby-on-rails-3 - Sprockets and Rails 3 - 添加新的预编译js文件

ruby-on-rails - 遇到错误 "couldn' t find file 'ckeditor/override' "在我的 application.js 文件中的问题

jquery - Sprockets 未加载 list 文件(jQuery、jQuery_ujs)

ruby-on-rails - asset_host 和相关协议(protocol) URL 被更改为 http

CSS 不起作用,仅适用于移动 3G/4G

ruby-on-rails - Rails 3.1 Assets 管道 : how to load controller-specific scripts?

ruby-on-rails - 更新到 Rails 4 后 Assets 预编译的问题