Я пытаюсь реализовать добавление дополнительных файлов и удалить один файл с 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
Есть идеи?