【问题标题】:Disable Rails 3.1 asset pipeline for images only?仅对图像禁用 Rails 3.1 资产管道?
【发布时间】:2012-02-28 03:17:05
【问题描述】:

我正在将 Rails 3 应用升级到 3.2 并设置资产管道。这对 css/js 来说很棒,但我并没有真正看到将它用于图像的意义,不幸的是我有大量引用 /images/*.png 之类的 css。

有没有办法只为图像禁用资产管道,以便image_tag("x.png") 将返回返回<img src="/images/x.png"> 而不是<img src="/assets/x.png">?谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline ruby-on-rails-3.2


    【解决方案1】:

    你可以猴子补丁 ActionView::Base,在 rails 控制台试试这个:

    helper.image_path "foo" #=> "/assets/foo"
    
    module OldImagePath
      def image_path(source)
        asset_paths.compute_public_path(source, 'images')
      end
      alias_method :path_to_image, :image_path
    end
    ActionView::Base.send :include, OldImagePath
    
    helper.image_path "foo" #=> "/images/foo"
    

    例如,您可以将其放在初始化程序中。默认情况下 ActionView::Base 包括 ActionView::Helpers::AssetTagHelper 和 Sprockets::Helpers::RailsHelper 两者都定义了 image_path 但后者优先。我包含了我自己的模块,它优先于所有模块(里面的代码取自 ActionView::Helpers::AssetTagHelper)。

    尽管如此,对图像使用资产管道也很有意义。它们在文件名中获取哈希和,因此可以在客户端永久缓存它们,而无需询问服务器文件是否已更改。

    【讨论】:

    • 谁能确认这行得通?我最终硬着头皮接受了图片的资产管道。
    • 谢谢!如果通过资产管道解析图像路径时发生错误,我使用此技术防止 AssetNotPrecompiledError 在生产中产生 500 服务器错误。在我对 image_path 的覆盖中,我只调用了“super(source)”,但添加了一个记录错误并为路径返回“#”的救援子句。正如您所建议的,我将 'ActionView::Base.send' 行放入初始化程序中。完美运行!
    【解决方案2】:

    看看这个宝石: https://github.com/spohlenz/digestion,它应该做你需要的:)。

    否则,您可以将不希望包含在资产管道中的资产从应用/资产移回公共(例如公共/图像)。一切都应该按照您的预期工作,无需宝石。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2011-12-19
      相关资源
      最近更新 更多