Rails 3.1: Determine if asset exists

Ruby on-Rails-3.1Asset Pipeline

Ruby on-Rails-3.1 Problem Overview


Is there a built-in way to determine if an asset exists without resorting to File.exists?(File.join(Rails.root, "foo", "bar", "baz")) and that looks through the asset paths.

My app goes and fetches images from a remote server on a Resque queue; until we have the image downloaded I want to serve a placeholder image. Currently I'm using File.exists... but this means hard-coding a path, which sucks, or looking through the configured asset paths. It seems like this should be there already, but I can't find it in the docs.

Ruby on-Rails-3.1 Solutions


Solution 1 - Ruby on-Rails-3.1

Given an image in app/assets/images/lolshirts/theme/bg-header.png,

Rails.application.assets.find_asset 'lolshirts/theme/bg-header.png'
 => #> Sprockets::StaticAsset:0x80c388ec pathname="/Users/joevandyk/projects/tanga/sites/lolshirts/app/assets/images/lolshirts/theme/bg-header.png", mtime=2011-10-07 12:34:48 -0700, digest="a63cc84aca38e2172ae25de3d837c71a">

Rails.application.assets.find_asset 'notthere.png'
 => nil

Solution 2 - Ruby on-Rails-3.1

Since this is still the top question when searching Google, and since the accepted answer does not work properly in production (at least in some cases), here is the solution that works for me (Rails 4.x to 6.x at least):

def asset_exist?(path)
  if Rails.configuration.assets.compile
    Rails.application.precompiled_assets.include? path
  else
    Rails.application.assets_manifest.assets[path].present?
  end
end

This is copied from this github issue

Solution 3 - Ruby on-Rails-3.1

See this answer: https://stackoverflow.com/a/8217598/549252

= Rails.application.assets.find_asset("my_asset.css").nil?

Solution 4 - Ruby on-Rails-3.1

Please see the answer here for a discussion on why find_asset may not always work:

https://stackoverflow.com/questions/8206661/include-assets-only-if-they-exist/22566120#22566120

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJim ZajkowskiView Question on Stackoverflow
Solution 1 - Ruby on-Rails-3.1Joe Van DykView Answer on Stackoverflow
Solution 2 - Ruby on-Rails-3.1DannyBView Answer on Stackoverflow
Solution 3 - Ruby on-Rails-3.1Tatiana TyuView Answer on Stackoverflow
Solution 4 - Ruby on-Rails-3.1rustyView Answer on Stackoverflow