Как проверить, существует ли изображение в 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
если присутствует