Active Storage загружать изображения, даже если в форме есть ошибки? - PullRequest
0 голосов
/ 31 января 2019

В прошлый раз, когда я проводил некоторые тесты в форме транспортного средства, я не заполнил никаких полей, кроме загрузки файла.Я вставил туда несколько изображений и нажал кнопку «Отправить».Поскольку некоторые атрибуты имеют проверки, форма возвращается с ошибками (как и предполагалось), но изображения уже были загружены.Теперь, если я решу выйти из формы, я не буду вставлять транспортное средство, но я уже вставил изображения.Эти изображения не удаляются при выходе из формы.

Вопрос. При загрузке следует вставлять их не только после проверки отсутствия ошибок в форме?И если это нормальная процедура, то что мне нужно сделать, чтобы это исправить?

Единственное, что приходит мне в голову, - это делать что-то подобное (и я думаю, что это не очень разумно):

#vehicles_controller.rb

def create
  @vehicle = Vehicle.new(vehicle_params)
  if @vehicle.save
    redirect_to @vehicle
  else
    @vehicle.images.purge <--------
    render 'new'
  end
end

Это прекрасно работает, если я неиспользуйте прямую загрузку Active Storage, где в этом случае появляется эта ошибка:

enter image description here

Надеюсь, вы мне поможете.Спасибо!

1 Ответ

0 голосов
/ 31 января 2019

При использовании прямой загрузки файлы загружаются в хранилище, как только они прикрепляются к форме, а не при отправке формы.

Что происходит, когда файлы прикрепляются, браузер делает запросна Rails для временного URL прямой загрузки в ваше хранилище (S3, Azure, Google и т. д.), отсюда и название Direct Upload.Это означает, что файлы не должны передаваться через ваш сервер, что отнимает много лишних усилий.Когда Rails отвечает временным URL-адресом для загрузки, он также создает запись Blob и отправляет ключ для этого BLOB-объекта также в браузер.

Как только браузер успешно обработал прямую загрузку, он скрывает скрытый элемент.в DOM, который ссылается на ключ BLOB.Затем, когда вы отправляете форму, если действие отправки успешно, Rails присоединит BLOB-объект к вашей модели Транспортного средства (используя полиморфную запись ActiveStorage :: Attachment).Только на этом этапе изображение (BLOB-объект) фактически прикрепляется к вашей записи транспортного средства.

Если отправка формы не удалась, BLOB-объект не будет прикреплен к вашей записи.Если это произойдет, вы не сможете удалить BLOB-объект, используя метод, описанный выше, поскольку он не связан с @vehicle.Разумное решение может состоять в том, чтобы периодически запускать грабли, которые ищут BLOB-объекты, которые не имеют вложений, и удаляют их.

...