Изображения в Active Storage не отображаются на странице ERB, но отображается другая страница ERB - PullRequest
0 голосов
/ 21 марта 2019

Я где-то немного растерялся, поскольку у меня есть сборка с активным хранилищем, и это нормально, и я могу видеть изображения и загружать изображения

Вот скриншот 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 ]

1 голос
/ 21 марта 2019

В вашей модели у вас есть has_many_attached :images

tool.images независимо от того, сколько изображений всегда будет возвращать ActiveSTorage::Attached::Many, то есть Enumerable, поэтому вам придется пройтись по нему, чтобы получить каждый image, в цикле каждое изображение будет ActiveStorage::Blob, чтобы использовать image_tag, вам понадобится URL для изображения, чтобы получить URL из BLOB-объекта, который вы будете использовать url_for(image).

Вот пример:

<% tool.images.each do |image| %>
  <%= image_tag(url_for(image), class: 'some-class') %>
<% end %>

В вашем случае вы хотели, чтобы изображение было ссылкой, это легко сделать, просто нужно передать правильную информацию link_to.Вы можете сделать это несколькими способами. Я думаю, что это легче всего читать.

Со ссылкой:

<% tool.images.each do |image| %>
  <%= link_to "Path to Tool as string" do %>
    <%= image_tag(url_for(image), class: 'some-class') %>
  <% end %>
<% end %>
1 голос
/ 21 марта 2019

Это API для link_to:

link_to name, options = {}, html_options = nil

Это API для image_tag:

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 %>
...