【问题标题】:Compiling Sass with custom variables per request under Rails 3.1在 Rails 3.1 下根据请求使用自定义变量编译 Sass
【发布时间】:2011-12-04 03:33:55
【问题描述】:

在 Rails 3.1 应用程序中,一个控制器需要使用一组自定义变量让其所有视图编译他们每次请求可能需要的任何 Sass 样式表。理想情况下,编译必须通过资产管道进行,以便生成基于内容的资产名称(包括内容的 MD5 散列的名称)。对于解决方案而言,使用纯 Sass 功能而不是诉诸于例如 Sass 样式表的 ERB 处理,这一点很重要。

根据我在这里和其他地方所做的研究,以下似乎是一种可能的方法:

  1. 设置变量访问

    • 使用自定义 Sass 函数创建某种类型的变量访问器桥,例如,如 Konstantin Haase here (gist) 所述。这似乎很容易做到。

    • 通过 Sass 部分配置所有变量访问,例如,在 _base.sass 中,这是 Compass 方式。部分可以使用上面定义的自定义函数。也很简单。

  2. 捕获所有资产引用

    • 装饰视图对象的asset_path方法。我的这个很好用。

    • 使用Sprockets::Environment 的自定义子类解析引用。这也很好用。

  3. 强制资产重新编译,无论文件修改时间如何

    • 我还没有找到一个好的解决方案。

    • 我已经看到通过实例化新的Sass::Engine 并传递将在Sass::Script::Functions::EvaluationContext 中可用的自定义数据来手动启动 Sass 处理的示例。这种方法的问题是我必须自己管理文件命名和路径,而且我总是冒着可能偏离 Sprockets 所做的事情的风险。

    • 我找不到任何基于每个请求强制 Sprocket 处理的示例,无论文件修改时间如何,这也允许自定义变量传递。

我很感激 cmets 关于一般方法以及如何最好地处理 (3) 的任何具体指针/建议。

【问题讨论】:

    标签: ruby-on-rails-3 ruby-on-rails-3.1 sass asset-pipeline sprockets


    【解决方案1】:

    模拟。

    这是可能的。看这里SASS: Set variable at compile time

    我写了一个解决方案来解决这个问题,我会尽快发布并推送到这里,以防你或其他人仍然需要它。

    【讨论】:

      【解决方案2】:

      SASS 旨在预编译为 CSS。让 Sprockets 为每个请求的每个请求执行此操作不会很好地执行。每个请求都必须等待编译完成,而且速度不快(从服务页面的角度来看)。

      MD5 生成在 Sprockets 中,因此如果您要更改自定义变量,您将不得不对每个请求强制进行编译,以确保看到更改,因为视图(可能)不会知道。

      听起来好像这并不是资产管道的最佳选择,您应该考虑为真正动态的 CSS 做一些更优化的事情。

      对不起。 :-)

      【讨论】:

      • Richard,您的回答假设有问题的 Rails 应用程序将经历高负载。它不会。实际上,它提供的是一种低负载的后端服务。它的目的是根据请求参数的细微变化动态生成(编译,实际上)资产版本,因此需要在每次请求时重新运行资产管道。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2011-09-17
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 2014-04-20
      • 2011-11-25
      相关资源
      最近更新 更多