Как отобразить изображение в индексном режиме

Я использую carrierwave и пытаюсь отображать изображения продуктов в индексном режиме. Это мои модели, контроллеры и представления

product.rb

 class Product < ActiveRecord::Base
   has_many :order_items
   belongs_to :category, required: false
   has_many :product_attachments
   accepts_nested_attributes_for :product_attachments

   mount_uploader :image, ImageUploader
   default_scope { where(active: true) }
end

product_attachment.rb

   class ProductAttachment < ApplicationRecord
     mount_uploader :image, ImageUploader
     belongs_to :product
   end

products_controller.rb (извлечение)

class ProductsController < ApplicationController
  def index
  @products = Product.all
  @order_item = current_order.order_items.new
end


def show
  @product = Product.find(params[:id])
  @product_attachments = @product.product_attachments.all
end

def new
  @product = Product.new
  @product_attachment = @product.product_attachments.build
  @categories = Category.all.map{|c| [ c.name, c.id ] }
end

def create
  @product = Product.new(product_params)
  @product.category_id = params[:category_id] 

  respond_to do |format|
  if @product.save
    params[:product_attachments]['image'].each do |a|
      @product_attachment = @product.product_attachments.create!(:image => a,     :product_id => @product.id)
    end
    format.html { redirect_to @product, notice: 'Product was successfully created.' }
  else
    format.html { render action: 'new' }
   end
  end
end

private
  def product_params
    params.require(:product).permit(:name,:price, :active,  :description, product_attachments_attributes: 
[:id, :product_id, :image], category_attributes: [:category_id, :category])
   end
end

index.html.erb

<div class = "row">
  <div class = "col-xs-offset-1 ">
   <% @products.each do |product| %>
     <%= render "product_row", product: product, order_item: @order_item %>
   <% end %>
</div>

_product_row.html.erb

<div class = "well">

  <div class = "row">

  <div class = "container-fluid row">
  <div class = "col-md-5 col-lg-5 col-sm-5 col-xs-5 binder">
    <br><%= image_tag product.image_url.to_s %><br><br>
 </div>
  <div class = "col-md-4 col-lg-4 col-sm-4 col-xs-4 binder">
    <h4 class = "text-left"><%= product.name.split.map(&:capitalize).join(' ') %> </h4>
    <h4 class = "text-left"><span style = "color: green"><%= number_to_currency(product.price, :unit => "€") %></span></h4>
    <h4><%= link_to Category.find(product.category_id).name, category_path(product.category_id) %></h4>
    <h6 class = "text-left"><%= link_to 'Delete', product_path(product), method: :delete,
          data: { confirm: 'Are you sure?' } %></h6><br><br>
  </div>

 <div class = "col-md-3 col-lg-3 col-sm-3 col-xs-3 binder">

  <%= form_for order_item, remote: true do |f| %>
    <div class = "input-group">
      <%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %>
      <div class = "input-group-btn">
        <%= f.hidden_field :product_id, value: product.id %>
        <%= f.submit "Add to Cart", class: "btn btn-primary text-right" %>
      </div>
    </div>
  <% end %>
 </div>
 </div>

 </div>
</div>

С <%= image_tag product.image_url.to_s %> образ не появляется. Когда я меняю его на <%= image_tag product_attachments.first.image_url.to_s %>, я получаю следующую ошибку:

 undefined local variable or method `product_attachments' for #<#<Class:0x00007f28544ccc68>:0x00007f285dd3aab8>

Я новичок в Ruby и не знаю, что делаю не так и как это исправить. Любая помощь будет оценена по достоинству. Я использую Ruby версии 2.5.1 и rails 5.2.0 на ubuntu.

Может, вы имели в виду @product_attachments?

jvillian 06.06.2018 21:46

Спасибо @jvillian, я попробовал и получил ошибку undefined method first for nil:NilClass

KH_ 06.06.2018 21:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
418
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я ожидал, что работает следующее:

<%= image_tag product.product_attachments.first.image_url.to_s %>

Если я хорошо понимаю ваши фрагменты, модель, которую вы устанавливаете ImageUploader, - это ProductAttachment (с атрибутом image), поэтому вы можете удалить mount_uploader :image, ImageUploader из своей модели Product.

Образ монтируется на каждый product_attachments для одного продукта. Просто отобразите изображения внутри партиала, повторяя product_attachments:

<% product.product_attachments.each do |attachment| %>
  <%= image_tag(attachment.image.url) %>
<% end %>

это сработало, спасибо. Я хотел бы отобразить только первое изображение, но по какой-то причине использование первого метода, предложенного Спикерманом, возвращает ошибку. Вы, может быть, знаете почему?

KH_ 06.06.2018 22:32
Ответ принят как подходящий

Попробуй это:

image_tag(product.product_attachments.first.image.url.to_s)

Он должен работать. Я понял, что иногда image_url работает не так, как ожидалось, а image.url работает.

Другие вопросы по теме