【问题标题】:Asset Pipeline Cacheing CSS?资产管道缓存 CSS?
【发布时间】:2011-12-01 03:28:09
【问题描述】:

我正在开发 Rails 3.1 应用程序。我创建了一个application.css.scss.erb 文件。 .erb 到底是因为我想从配置文件中加载一个变量作为 css 中的颜色变量:

$highlight1: #<%= COLOR.highlight1 %>;
$highlight2: #<%= COLOR.highlight2 %>;

一切正常,但我遇到的问题是,每当我更改 COLOR.highlight1 中的值时,它不会反映更改,直到我进入我的 css 文件并更改某些内容(我通常添加一些空格和保存)。那是我看到变化的时候。显然,rails 正在查看文件是否已更改以更新更改。

有什么方法可以至少在开发过程中将其关闭,我可以看到更改而无需修改 css 文件?

也欢迎对我的技术提出任何批评/意见

【问题讨论】:

  • 出于好奇,为什么需要将它存储在常量中?
  • 实际上,我需要包含需要 LESS 的 Twitter Bootstrap。长话短说,我想要一个单独的地方,我可以在其中声明颜色,然后使用该颜色在 SASS 中声明值(这是我的应用程序自始至终使用的)和一点 LESS(这是 Twitter Bootstrap 的工作原理) .有意义吗?
  • 您尝试使用 guard 来监视您的 ruby​​ 文件并强制更新 sass - railscasts.com/episodes/264-guard

标签: ruby-on-rails css ruby-on-rails-3.1 sass asset-pipeline


【解决方案1】:

也许可以试试:

config.assets.digest = true

在您的开发配置文件中

【讨论】:

    【解决方案2】:

    Sprockets depend_on 指令用于声明这些类型的依赖项。因此,在您的 css.scss.erb 文件的顶部,连同其他指令(require 和friends),放置如下内容:

    //= depend_on "/path/to/colors.rb"
    

    那么当/path/to/colors.rb文件发生变化时,它也会强制css更新。

    不幸的是,我从来没有让它与一个资产目录(javascripts/stylesheets/images)的文件外部的相对路径一起工作,所以Sprockets解析的方式可能有问题防止这种情况发生的路径,否则我会遗漏一些东西。这使您可以选择指定绝对路径,这几乎肯定不会在您的所有应用程序环境中工作,或者将常量文件放入您的资产目录(例如,app/assets/stylesheets/colors.rb)。

    作为参考,这里是来自 Sprockets (2.0.3) 源代码的 depend_on 指令的文档,位于 sprockets/directive_processor.rb

      # Allows you to state a dependency on a file without
      # including it.
      #
      # This is used for caching purposes. Any changes made to
      # the dependency file will invalidate the cache of the
      # source file.
      #
      # This is useful if you are using ERB and File.read to pull
      # in contents from another file.
      #
      #     //= depend_on "foo.png"
      #
    

    如果有人知道如何指定到其他地方的相对路径,例如 config/initializers 之类的,请告诉我!

    【讨论】:

    【解决方案3】:

    http://guides.rubyonrails.org/configuring.html

    • config.assets.compile 是一个布尔值,可用于在生产中打开实时 Sprockets 编译。

    可能想尝试一下,但我不确定它是否实时编译,至少它应该禁用缓存。

    【讨论】:

      【解决方案4】:

      除了大卫费伯的回答。我也需要使用相对路径。

      我想用语言环境字典生成一个 js 文件,如果语言环境文件被更改,它将更新:

      //= depend_on "../../../config/locales/en.yml"
      //= depend_on "../../../config/locales/ja.yml"
      
      var locales = <%= locales.to_json %>;
      

      事实证明,当前(Rails 3.2.3)相对路径只有在相对路径也在资产路径中时才有效!

      所以丑陋的解决方案是在config/application.rb中添加路径:

      config.assets.paths.unshift Rails.root.join("config", "locales").to_s
      

      【讨论】:

        【解决方案5】:

        我试试这个,它有效

        在 application.rb 中

        config.autoload_paths += %W(#{config.root}/lib/assets_variables)
        config.assets.paths << File.join(Rails.root, 'lib', 'assets_variables')
        

        在 lib/assets_variables/color.rb 中

        module Color
          def self.default
            'blue'
          end
        end
        

        在 app/assets/stylesheets/color.css.scss.erb 中

        //= depend_on "color.rb"
        $default_color: <%= Color::default %>;
        .content {
          color: $default_color;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-30
          • 1970-01-01
          • 2013-04-01
          • 2011-10-04
          • 1970-01-01
          • 2013-05-19
          • 2012-08-29
          • 2012-04-17
          相关资源
          最近更新 更多