Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails资产管道-如何确定资产是否存在?_Ruby On Rails 4_Asset Pipeline - Fatal编程技术网

Ruby on rails 4 Rails资产管道-如何确定资产是否存在?

Ruby on rails 4 Rails资产管道-如何确定资产是否存在?,ruby-on-rails-4,asset-pipeline,Ruby On Rails 4,Asset Pipeline,有没有办法询问资产管道是否存在资产?我看到的建议主要涉及使用file.exist?手动检查文件路径。问题是我有几个包含资产的gem,所以我必须查看每个gem的资产目录,对吗?这看起来像是我希望被烘焙到资产管道中的东西,但我找不到任何参考 我目前的解决方案是一个丑陋的黑客,所以我希望你有更好的东西。调用asset\u path(file)将返回资产的新URL(/asset/xyz),或者返回不存在的相同路径(或者是绝对路径)。因此,我的丑陋的黑客是: def has_asset?(path)

有没有办法询问资产管道是否存在资产?我看到的建议主要涉及使用
file.exist?
手动检查文件路径。问题是我有几个包含资产的gem,所以我必须查看每个gem的资产目录,对吗?这看起来像是我希望被烘焙到资产管道中的东西,但我找不到任何参考

我目前的解决方案是一个丑陋的黑客,所以我希望你有更好的东西。调用
asset\u 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

我刚刚发现我可以使用
资产。查找资产

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

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

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

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

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

为了让谷歌在这里登陆-请小心,如果有人正在寻找一个在生产环境中有效的解决方案,那么这似乎在生产环境中无法正常工作,请参阅
Rails.application.assets\u manifest.find\u sources(path)
无法返回
nil
(带有链轮的Rails 4 3)。我使用了
Rails.application.assets\u manifest.find\u sources(path).any?
。谢谢你的代码!