我正在使用
rails 6.1.4
和 ruby 3.1.1
我的应用程序在 Heroku 上。我的
assets/images
目录中有几个图像,但当我部署到实时环境时,我无法显示其中一些图像。应用程序中显示了其他图像,所以我敢打赌牧场这是我的代码。所有图像都显示在我的本地计算机上。
该应用程序将
assets/images/badges/
中的图像与 image_name
模型中的 Badge
进行匹配。目前,assets/images/badges/
中没有每个 Badge.image_name
的图像。
助手获取与 image_names 匹配的图像并将名称发送到数组中的视图。但是,如果图像不存在,我不想显示
broken-image
图标。因此,在将图像添加到数组之前,我使用 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 %>
作为对我的节目视图的测试,我为我知道的其中一张图像创建了一个图像标签。
<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...
。奇怪的!!但我想它知道如何导航到正确的路径。