Rails 6 Active Storage: не удалось найти или собрать BLOB-объект: ожидается присоединение, получил ноль - PullRequest
1 голос
/ 08 октября 2019

Только что создал новое приложение 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_, позволяющее несколько загрузок:

<%= 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])

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

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Хорошо, я мог бы решить проблему!

Проблема: update действие заменит все картинки.

Итак, вот что я сделал:

1) Я удалил images: [] из разрешенного списка (строгие параметры)

2) Я написал этот код, чтобы прикрепить каждое новое изображение отдельно и поместить его в действия create и update:

    if params[:page][:images].present?
      params[:page][:images].each do |image|
        @page.images.attach(image)
      end
    end

#attach фактически разрешит параметр.

Не уверен, что это был лучший способ, но теперь он работает

1 голос
/ 09 октября 2019

В Rails 6 поведение по умолчанию для has_many_attached было изменено с Rails 5. Ранее файлы добавлялись в список вложений, а не переопределялись.

К счастью, это значение по умолчанию можно изменить в вашем application.rb:

config.active_storage.replace_on_assign_to_many = false

Затем можно сохранить раздел images: [] в списке разрешенных и полностью удалить вызов @page.images.attach(params[:images]).

...