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

问题描述 投票:0回答:4

有什么方法可以询问Asset Pipeline资产是否存在?我看到的建议主要涉及使用

File.exist?
手动检查文件路径。问题是我有几个包含资产的 gem,所以我必须查看每个 gem 的资产目录,对吗?这似乎是我希望被纳入资产管道中的东西,但我找不到任何对它的引用。

我目前的解决方案是一个丑陋的黑客,所以我希望你有更好的东西。调用

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
ruby-on-rails-4 asset-pipeline
4个回答
19
投票

我刚刚发现我可以使用

assets.find_asset
:

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

13
投票

当前接受的答案在生产中不起作用。

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

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
投票

我在使用上述建议的解决方案时遇到问题,有时当资产不存在时返回 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

0
投票

在开发中使用 Propshaft,您将需要使用:

Rails.application.assets.load_path.find('path/filename.jpg').present?

不确定产品。

© www.soinside.com 2019 - 2024. All rights reserved.