Rails Asset Pipeline - 如何确定资产是否存在?

时间:2014-09-13 18:59:12

标签: ruby-on-rails-4 asset-pipeline

如果资产存在,有没有办法询问资产管道?我基本上看到的建议涉及使用File.exist?手动检查文件路径。问题在于我有几个包含资产的宝石,所以我必须查看每个资产目录,对吧?这似乎是我希望融入资产管道的东西,但我无法找到它的任何参考。

我目前的解决方案是一个丑陋的黑客,所以我希望你有更好的东西。调用asset_path(file)将返回资产的新URL(/ asset / xyz),如果不存在则返回相同的路径(或者它是绝对路径)。所以我丑陋的黑客是:

def has_asset?(path)
  # Asset pipeline only does relative paths
  if path[0] == '/'
    return false
  end
  asset_path(path) != '/#{path}'
end

3 个答案:

答案 0 :(得分:10)

我刚发现我可以使用assets.find_asset

def has_asset?(path)
  Rails.application.assets.find_asset(path) != nil
end

答案 1 :(得分:5)

目前接受的答案在制作中不起作用。

我使用以下方法在开发和生产环境中工作:

module AssetHelper
  def asset_exists?(path)
    if Rails.env.production?  
      Rails.application.assets_manifest.find_sources(path) != nil
    else
      Rails.application.assets.find_asset(path) != nil
    end
  end
end

答案 2 :(得分:0)

我对上述建议的解决方案有疑问,当资产不存在时有时返回true可以解决问题

def asset_exists?(path)
  if Rails.env.production?
    all_assets = Rails.application.assets_manifest.find_sources(path)

    if all_assets
      keys = Rails.application.assets_manifest.assets.keys

      if keys.include?(path)
        true
      else
       false
      end
    else
      false
    end
  else
    Rails.application.assets.find_asset(path) != nil
  end
end