Rails Carrierwave добавить больше файлов undefined метод `identifier ' - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь реализовать добавление дополнительных файлов и удалить один файл с carrierwave gem.Я следовал инструкциям, которые нашел здесь .Но когда я пытаюсь добавить больше файлов, старые становятся NUL и по какой-то причине удаляются.Никакой ошибки не появляется, но если я смотрю на консоль, я получаю это:

SQL (0.5ms)  UPDATE "items" SET "images" = $1, "updated_at" = $2 WHERE "items"."id" = $3  [["images", "{NULL,NULL,image5.jpg,image6.jpg}"], ["updated_at", "2018-10-18 07:58:52.685554"], ["id", 85]] (0.4ms)  COMMIT

Также, когда я пытаюсь удалить файл, ничего не происходит.Никакой ошибки не появляется, и файл все еще остается как есть, но если я смотрю на консоль, я получаю это:

 SQL (0.6ms)  UPDATE "items" SET "images" = $1, "updated_at" = $2 WHERE "items"."id" = $3  [["images", "{NULL,NULL,image5.jpg,image6.jpg}"], ["updated_at", "2018-10-18 08:00:29.641571"], ["id", 85]] (0.4ms)  COMMIT

Я понятия не имею, почему это происходит, и я пытался решить эту проблемукакое-то время, поэтому любая помощь в том, как сделать эту работу, будет очень цениться.

Вот настройка, которую я имею:

Я добавил этот столбец в модель элемента:

add_column :items, :images, :string, array: true, default: []

У меня есть следующие маршруты:

match 'store/item/:id'=> 'attachments#destroy', :via => :delete, :as => :remove_item_image
post "store/item/:id"=> "attachments#create", :as => :create_item_image

Контроллер:

class AttachmentsController < ApplicationController
before_action :set_item

def create
  add_more_images(images_params[:images])
  flash[:error] = "Failed uploading images" unless @item.save
  redirect_back fallback_location: root_path
end

def destroy
  remove_image_at_index(params[:id].to_i)
  flash[:error] = "Failed deleting image" unless @item.save
  redirect_back fallback_location: root_path
end

private

def set_item
  @item = Item.find(params[:id])
end

def add_more_images(new_images)
  images = @item.images
  images += new_images
  @item.images = images
end

def remove_image_at_index(index)
  remain_images = @item.images # copy the array
  deleted_image = remain_images.delete_at(index) # delete the target image
  deleted_image.try(:remove!) # delete image from S3
  @item.images = remain_images # re-assign back
end

def images_params
  params.require(:item).permit({images: []}) # allow nested params as array
end
end

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

<% @item.images.each_with_index do |img, index| #grab the index %>
<%= image_tag(img.url(:mini)) %>
<%= link_to "Remove", remove_item_image_path(@item, index: index), data: { confirm: "Are you sure you want to delete this image?" }, :method => :delete %>
 <% end %>

Это форма для добавления дополнительных изображений:

<%= form_for @item, url: create_item_image_path(@item), method: :post , :html => {:id => "form", :multipart => true } do |f| %>
 <%= f.file_field :images, multiple: true %>
 <%= f.submit 'Add more files' %>
 <% end %>

Обновление 1

Когда я пытаюсь добавить локальное изображениевручную с rails console я делаю это:

@item = Item.find(85)
@item.images << [File.open("#{Rails.root}/app/assets/images/no-image.jpg", 'rb')]

Новые локальные изображения добавляются в массив, но когда я делаю это @item.save, я получаю следующую ошибку:

NoMethodError: undefined method `identifier' for #<Array:0x007fd2536ccd98>
    from (irb):4

Есть идеи?

1 Ответ

0 голосов
/ 18 октября 2018

Вы добавляете массив к ассоциации @ item.images, он ожидает файл и пытается вызвать для него identifier.Задайте только файл:

@item.images << File.open("#{Rails.root}/app/assets/images/no-image.jpg", 'rb')

Если вы хотите добавить несколько изображений одновременно, вы можете сделать это в цикле или, возможно, у объекта @image.images есть какой-то метод для добавления нескольких изображений (я не могу найтиэто на документах, но я думаю, что есть один).По указанной вами ссылке:

images += new_images
...