Как проверить, существует ли изображение в Rails?

<%= image_tag("/images/users/user_" + @user_id.to_s + ".png") %>

Как вы проверяете, есть ли такое изображение, а если нет, то ничего не отображать?

работа в рельсах 3.07.

4 ответов


можно использовать .существовать?.

if FileTest.exist?("#{RAILS_ROOT}/public/images/#{img}")
  image_check = image_tag("#{img}",options)
else
  image_check = image_tag("products/noimg.gif", options)
end

другие ответы немного устарели из-за изменений в конвейере Rails asset с Rails 4. В рельсах 4 и 5 работает следующий код:

Если ваш файл помещен в общественные каталог, затем его существование можно проверить с помощью:

# File is stored in ./public/my_folder/picture.jpg
File.file? "#{Rails.public_path}/my_folder/picture.jpg"

однако, если файл помещен в активы каталог затем проверка существования немного сложнее, из-за предварительной компиляции активов в производственных средах. Я рекомендую следующее: подход:

# File is stored in ./app/assets/images/my_folder/picture.jpg

# The following helper could, for example, be placed in ./app/helpers/
def asset_exists?(path)
  if Rails.configuration.assets.compile
    Rails.application.precompiled_assets.include? path
  else
    Rails.application.assets_manifest.assets[path].present?
  end
end

asset_exists? 'my_folder/picture.jpg'

вы можете использовать файл.файл? метод.

if File.file?("#{Rails.root}/app/assets/images/{image_name}")
  image_tag("#{image_name}")
end

вы также можете использовать файл.существовать? метод, но он вернет true, если найдет каталог или файл. Файл метода? немного более придирчив, чем существует?


на рельсы 5 тот, который работал для меня

ActionController::Base.helpers.resolve_asset_path("logos/smthg.png")

возвращает nil если актив отсутствует и path_of_the_asset если присутствует