【问题标题】:Rails Asset Pipeline - How to determine if an asset exists?Rails 资产管道 - 如何确定资产是否存在?
【发布时间】:2026-01-26 21:45:02
【问题描述】:

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

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

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


    【解决方案1】:

    刚刚发现可以使用assets.find_asset

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

    【讨论】:

    【解决方案2】:

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

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

    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
    

    【讨论】:

    • Rails.application.assets_manifest.find_sources(path) 无法返回 nil(带链轮 3 的导轨 4)。我用Rails.application.assets_manifest.find_sources(path).any?。感谢您提供此代码!
    【解决方案3】:

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

    【讨论】:

    • 好东西,谢谢!