Techioz Blog

Rails Heroku に画像ファイルが存在するかどうかを確認する方法

概要

私はRails 6.1.4とRuby 3.1.1を使用しています

私のアプリは Heroku 上にあります。 assets/images ディレクトリにいくつかのイメージがありますが、ライブにデプロイするときに一部のイメージを表示できません。アプリ内の他の画像も表示されるので、牧場側のコードによるものだと確信しています。すべての画像がローカル マシンに表示されます。

アプリは、assets/images/badges/ 内の画像を Badge モデル内の image_name と照合します。現在、assets/images/badges/ には、すべての Badge.image_name の画像がありません。

ヘルパーは、image_names に一致する画像を取得し、その名前を配列でビューに送信します。ただし、画像が存在しない場合、壊れた画像アイコンを表示したくありません。そこで、画像を配列に追加する前に、 if Rails.application.assets.find_asset(image_path) != nil を使用して画像の存在をテストします。私の推測では、これが問題の領域であり、assets/images/badges ディレクトリにある画像をテストする他に方法がわかりません。

コード:

app/images/badges/ (just listing 3 here)

boxing-1-bronze-150.png
boxing-1-gold-150.png
boxing-1-silver-150.png
...

Heroku にログインし、app/images/badges ディレクトリをリストすると、これらのイメージがそこにあり、正しい名前が付けられていることがわかります。

badges_helprer.rb

badge_images = []

if badges 
  badges.uniq!
  badges.each do |b|
    image_path = "badges/#{b.image_name}"
    if Rails.application.assets.find_asset(image_path) != nil
      badge_images << image_path
    end
  end
end

return badge_images

ビュー:

students/show

<% badges = get_badges_for_student(@student) %>

 <% if badges %>

   <% b_count = 0 %> 
   <% badges.each do |b| %>
     <% if b_count == 3 %>  <!-- 3 images per row -->
       <br />
       <% b_count = 0 %>
     <% end %>
     <%= image_tag(b) %>
     <% b_count += 1 %>
   <% end %>

  <% end %>

ショー ビューのテストとして、存在することがわかっている画像の 1 つに対して画像タグを作成しました。

<p>Test: <%= image_tag("badges/boxing-1-gold-150.png") %></p>

表示されているので、ヘルパー ページに戻り、次の行に賭けます: if Rails.application.assets.find_asset(image_path) != nil が私が思うように動作していません。

assets/images/badges/ ディレクトリ内の画像ファイルをテストするより良い方法はありますか。

助けてくれてありがとう!

解決策

これが機能することがわかりました:

if File.exists?(Rails.root.join('app','assets','images','badges',image_name))

注: Heroku の Rails.root では app-name/app が表示されるため、上記の Rails.root.join(‘app’,‘assets’,‘images’,‘badges’,image_name) では app/app/assets… が表示されます。ビューで印刷します。奇数!!しかし、正しいパスに移動する方法を知っていると思います。