如何检查Rails中是否存在图像?

时间:2011-11-01 16:03:32

标签: ruby-on-rails ruby-on-rails-3 image filesystems

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

如何检查是否有这样的图像,如果没有,则不显示任何内容?

使用Rails 3.07。

4 个答案:

答案 0 :(得分:15)

您可以使用File.exist?

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

答案 1 :(得分:8)

由于自Rails 4以来Rails资产管道发生了变化,其他答案有点过时了。以下代码适用于Rails 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'

答案 2 :(得分:2)

你可以使用File.file吗?方法。

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

您还可以使用File.exist吗?方法,但如果找到目录或文件,它将返回true。 方法文件?比存在更挑剔?

答案 3 :(得分:2)

对于 Rails 5 ,对我有用的是

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

如果资产不存在,则

返回nil,如果存在,则返回path_of_the_asset