仅禁用Rails 3.1中的图像资产管道?

5
我正在升级一个Rails 3应用程序到3.2,并设置asset pipeline。它对于css/js非常好,但是我真的不认为使用它来处理图像有什么意义,不幸的是我的css有大量/images/*.png和类似的引用。
有没有办法仅针对图像禁用asset pipeline,以便image_tag("x.png")将返回<img src="/images/x.png">而不是<img src="/assets/x.png">?谢谢!
2个回答

4

您可以通过猴子补丁(monkey-patch)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)。
虽然如此,使用资产管道处理图像也是有意义的。它们在文件名中获得哈希值,因此可以在客户端上永久缓存它们,而无需询问服务器文件是否已更改。

有人能确认这个可行吗?最终我咬紧牙关,也开始使用资产管道来处理图片。 - swrobel
谢谢!我使用了这种技术来避免在生产环境中,如果通过资产管道解析图像路径时发生错误,AssetNotPrecompiledError导致500服务器错误。在我的image_path覆盖中,我只是调用'super(source)',但添加了一个rescue子句来记录错误并返回“#”作为路径。正如您建议的那样,我将'ActionView :: Base.send'行放入了初始化程序中。完美运作! - Jan Hettich

0
看看这个宝石吧:https://github.com/spohlenz/digestion,它应该能满足你的需求 :).
否则,你可以将不想包含在资产管道中的资产从app/assets移回public(例如public/images)。一切都应该按照你的期望工作,而无需使用宝石。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接