2011-11-01 31 views

答えて

14

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 
+0

これはあなたのためにこれをしたので、画像ごとにこれを繰り返す必要はありません。だからファイルが存在すればそれをチェックしてください。それ以外の場合はnoimg.gifでスーパーです。または独自のヘルパーを作成するimage_or_default(img、options) – Yule

+0

そうですが、私は既存のフレームワークメソッドを変更することが嫌いなので、後でやり直すことをお勧めします。 –

+1

@BrianMaltzan次に、dbを使ってパスを知ることをお勧めします。これは、CDNを必要とする大規模なWebアプリケーションで行うことです。 –

2

File.fileは使用できますか?方法。

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

File.exist?を使用することもできます。ディレクトリやファイルが見つかるとtrueを返します。 メソッドファイル?存在するよりもやや厄介ですか?

5

他の回答には、少し古くなっているため、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' 
+0

'Rails.application.assets_manifest.find_sources(path).present?' – m1l05z