Active Storage上的图像未显示在ERB页面上,但显示了另一个ERB页面

时间:2019-03-21 16:36:19

标签: ruby-on-rails rails-activestorage ruby-on-rails-5.2

我迷失在某个地方,因为我建立了具有活动存储空间的画廊,而且还可以看到图像并上传图像

这是屏幕截图 enter image description here

但是有一个问题,当我尝试为列表页面创建新页面时,我试图在缩略图页面上获取图像

    <div class="row">
  <div class="col-md-3">
    <ul class="sidebar-list">
      <li class="sidebar-item"><%= link_to "Your tools Listings", tools_path, class: "sidebar-link active" %></li>

    </ul>
  </div>
  <div class="col-md-9">
    <div class="panel panel-default">
      <div class="panel-heading">
        Listings
      </div>
      <div class="panel-body">
        <% @tools.each do |tool| %>
          <div class="row">
            <div class="col-md-2">
                <%= tool.images %>
            </div>
            <div class="col-md-7">
              <h4><%= tool.listing_name %></h4>
            </div>
            <div class="col-md-3 right">
              <%= link_to "Update", listing_tool_path(tool), class: "btn btn-black-free-account" %>
            </div>
          </div>
          <hr/>
        <% end %>
      </div>
    </div>
  </div>
</div>

应该可以,只要它显示基于文本的图像,请参见下面的屏幕截图

enter image description here

所以我需要更改这些图像,因为我使用的是与第一个屏幕截图相同的方法,如下代码所示

<% if @tool.images.attached? %>

<div class="panel panel-default">
    <div class="panel-heading">
        Photo Display
    </div>
    <br>
    <div class="row">
        <% @tool.images.each do |image| %>
        <div class="col-md-4">
            <div class="panel panel-default tools-gallery-panel">
                <div class="panel-heading preview ">
                    <%= link_to image_tag(image, class:"img-thumbnail tools-gallery"), image %>
                </div>
                <div class="panel-body">
                    <span class="pull-right">
                        <i class="fa fa-trash-o fa-lg" aria-hidden="true"></i>
                       <%= link_to "Remove", delete_image_attachment_tool_path(image), method: :delete, data: {confirm: "Are you sure?"} %>
                    </span>
                </div>
            </div>
        </div>
        <% end %>
        <% end %>

    </div>

所以我复制了

 <%= link_to image_tag(image, class:"img-thumbnail tools-gallery"), image %>

这到新的列表页面的东西

所以我修改了列表页面

<% @tools.each do |tool| %>
  <div class="row">
    <div class="col-md-2">
        <%= tool.images %>
          <%= link_to image_tag(tool.images, class:"thumbnail"), images %>
    </div>
    <div class="col-md-7">
      <h4><%= tool.listing_name %></h4>
    </div>
    <div class="col-md-3 right">
      <%= link_to "Update", listing_tool_path(tool), class: "btn btn-black-free-account" %>
    </div>
  </div>
  <hr/>
<% end %>

我所有的错误 enter image description here

即使我尝试过

  <%= link_to image_tag(tool, class:"thumbnail"), images %>

Tool.rb

class Tool < ApplicationRecord
  belongs_to :user

  has_many_attached :images

  validates :tool_type, presence: true
  validates :power_type, presence: true
  validates :accessories, presence: true
  validates :brand, presence: true
  validates :price, presence: true


end

我也遇到同样的错误,任何建议都很好

2 个答案:

答案 0 :(得分:1)

这是link_to的API:

link_to name, options = {}, html_options = nil

这是image_tag的API:

image_tag source, options={}

最后,您看到此错误:

Can't resolve image into URL: undefined `to_model` for #<ActiveStorage::Attached::Many>

您收到此错误,是因为您尝试使用单个图像而不是“许多”的集合来创建图像标签。

看看您原来的工作代码(剥去了多余的HTML):

 <% @tool.images.each do |image| %>
   <%= link_to image_tag(image, class:"img-thumbnail tools-gallery"), image %>
 <% end %>

注意您如何遍历所有图像?这是因为@tool具有许多图像。它是图像的阵列。在link_to块中,您以单个图像作为参考正确定义了image_tag。现在,让我们看看您的错误代码:

<% @tools.each do |tool| %>
  <%= tool.images %>
  <%= image_tag(tool.images, class:"thumbnail"), images %>
<% end %>

这很奇怪。您是这样称呼的:

<%= tool.images %>

其中仅显示#<ActiveStorage::Attached::Many>的一个实例,您在调用它:

<%= link_to image_tag(tool.images, class:"thumbnail"), images %>

这只是尝试(但失败)将图像数组链接到单个image_tag实例,由于api,我们知道该实例无效。您可能想这样做:

<% @tools.each do |tool| %>
   <%= tool.images.each |image| %>
     <%= image_tag(image, class:"thumbnail"), image %>
   <% end %>
 <% end %>

答案 1 :(得分:1)

在您的模型中,您有has_many_attached :images

tool.images不管图像数量如何总是返回一个ActiveSTorage::Attached::Many的{​​{1}},所以您必须循环遍历它才能获取每个Enumerable每个图像将是一个image,要使用ActiveStorage::Blob,您将需要一个图像的URL,以便从要使用image_tag的Blob中获取该URL。

这里是一个例子:

url_for(image)

在您的情况下,您希望图像是一个链接,这也很容易做到,您只需将正确的信息传递给<% tool.images.each do |image| %> <%= image_tag(url_for(image), class: 'some-class') %> <% end %> 。您可以通过多种方式执行此操作,这是我认为最容易阅读的方式。

带有链接:

link_to