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

Jer*_*ick 7 asset-pipeline ruby-on-rails-4

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

我目前的解决方案是一个丑陋的黑客,所以我希望你有更好的东西.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
Run Code Online (Sandbox Code Playgroud)

Jer*_*ick 11

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

def has_asset?(path)
  Rails.application.assets.find_asset(path) != nil
end
Run Code Online (Sandbox Code Playgroud)

  • 为了让googlers登陆这里 - 小心,这似乎在生产中无法正常工作https://github.com/mileszs/wicked_pdf/issues/476 (8认同)
  • 如果有人正在寻找适用于生产的解决方案,请参阅[此答案](http://stackoverflow.com/a/35319530/413924) (3认同)

Gre*_*ass 6

当前接受的答案不适用于生产环境。

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

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
Run Code Online (Sandbox Code Playgroud)