Только что создано новое приложение Rails 6, и я пытаюсь разрешить добавление изображений в blob-объект active_storage вместо их замены через форму, созданную с помощью rails scaffold.
Следовал документации (https://guides.rubyonrails.org/active_storage_overview.html#has-many-attached), используя #attach в моем контроллере, но это приводит к странице с ошибкой и сохраняет поведение «по умолчанию», заключающееся в замене всех изображений вместо добавления новых изображений.
Использование Rails 6.0.0 с active_storage 6.0.0
Сначала я создал модель страницы, используя rails g scaffold Page name:string
, а затем добавил в свою модель page.rb связь с ActiveStorage has_many_attached :images
В своей форме я добавил поле file_field, разрешающее несколько загрузок:
<%= form.file_field :images, multiple: true %>
Вот мое действие по обновлению контроллера, обратите внимание, @page.images.attach(params[:images])
, которое, согласно документации, должно выполнять эту работу.
def update
respond_to do |format|
if @page.update(page_params)
@page.images.attach(params[:images])
format.html { redirect_to site_pages_path(@site), notice: 'Page was successfully updated.' }
format.json { render :show, status: :ok, location: @page }
else
format.html { render :edit }
format.json { render json: @page.errors, status: :unprocessable_entity }
end
end
end
При заполнении формы, прикреплении новых картинок и публикации я получил следующую ошибку:
ArgumentError in PagesController#update
Could not find or build blob: expected attachable, got nil
Указывая линию @page.images.attach(params[:images])
При проверке журналов сервера я заметил, что, несмотря на ошибку, поведение по умолчанию все еще работает: старые изображения удаляются, а новые прикрепляются.
params[:images].each do |image|
? - person Simon Mo   schedule 08.10.2019params[:page][:images].each do |image| @page.images.attach(image) end
Ошибок больше нет, но старые картинки все равно удаляются, а новые прикрепляются 2 раза! (потому что я тестировал с двумя изображениями) - person Simon Mo   schedule 08.10.2019if @page.update(page_params)
, сгенерированного rails scaffold, я слышал, что обновление фактически заменяет изображение по умолчанию в Rails 6. Может быть, мне следует перейти к чему-то более индивидуальному, чем использование сгенерированного действия. - person Simon Mo   schedule 08.10.2019def page_params_without_images
), использовать это для обновления, а затем продолжить, как вы - person Mark   schedule 08.10.2019