【问题标题】:Using only relevant assets with Rails 3.2 + Sprockets + LESS仅使用 Rails 3.2 + Sprockets + LESS 的相关资产
【发布时间】:2012-02-22 21:20:07
【问题描述】:

我对 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;
}

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

【问题讨论】:

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


    【解决方案1】:

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

    如果可以的话,在提供解决方案之前,我将对此进行一些研究。

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

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

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

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

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

    <%= stylesheet_link_tag "application", controller_name %>
    

    为了在生产环境中工作,您必须告诉 rails 预编译所有单独的 CSS 文件(在 application.rb 中):

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

    第二个是添加一个助手来仅在视图需要CSS时才呈现CSS。

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

    【讨论】:

    • 从 application.css 中删除 require_tree . 然后在主布局中添加一个 &lt;%= stylesheet_link_tag @current_controller %&gt; 怎么样?这样就可以保留主 application.css 的缓存。我刚试了一下,好像还可以。
    • 是的,我认为 require_tree 会被删除。
    猜你喜欢
    • 2013-02-27
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2017-08-14
    • 2013-01-31
    相关资源
    最近更新 更多