При использовании activestorage в Rails 6, как мне сохранить файл при повторном отображении формы?

В Rails 6 у меня есть форма с полем файла, и я использую activestorage для хранения файла. Если проверка завершилась неудачно после отправки формы, форма отображается повторно, показывая ошибки проверки. Как я могу сохранить файл, добавленный в поле файла при повторном отображении формы, чтобы пользователю не приходилось снова добавлять файл в форму?

Аналогичный вопрос уже существует для рельсов 5: Активное хранилище: рекомендуется сохранять / кешировать загруженный файл при повторном отображении формы, однако решение применимо только к Rails 5.


person Robban    schedule 18.06.2019    source источник
comment
Вы сказали, однако, что решение применимо только к Rails 5. Есть ли у вас какие-либо ошибки?   -  person escanxr    schedule 18.06.2019
comment
Комментарии в сообщении, на которое он ссылается, объясняют - rails 6 больше не хранит файл при назначении, а при сохранении, что означает, что используемый там метод не будет иметь доступа к требуемому файлу.   -  person Mark    schedule 18.06.2019
comment
Ой, моя плохая. Может быть, вам стоит подумать об использовании модели для сохранения вложений перед проверкой записи, а затем прикрепить их к записи, когда она будет сохранена?   -  person escanxr    schedule 18.06.2019
comment
У кого-нибудь есть ответ, как это сделать БЕЗ использования direct_upload? Мне действительно не нравится то, что мы должны сделать, чтобы открыть CORS и заставить эту работу работать.   -  person Michael Scott Shappe    schedule 21.05.2020


Ответы (2)


Поскольку Rails 6 не сохраняет файл при назначении, я нашел обходной путь - включить прямую загрузку в поле файла. Это загрузит файл через javascript перед отправкой формы.

= f.file_field :doc, direct_upload: true

Чтобы это работало, вам также необходимо добавить activestorage.js в свой пакет, как описано в Руководство по Active Storage.

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

= f.file_field :doc, direct_upload: true
= f.hidden_field :doc, value: f.object.doc.signed_id if f.object.doc.attached?
person Robban    schedule 27.06.2019
comment
Разве скрытое поле не должно быть первым? youtu.be/mG1BUMuSmsc?t=577 - person M-Dahab; 11.05.2020
comment
Это не работает при редактировании элемента, к которому уже есть вложение. Он сохранит существующее приложение. - person Kieran Andrews; 15.05.2020

В дополнение к ответу Роббана, для нескольких вложений и выполнения предварительного просмотра

  = f.file_field :attachments, multiple: true, direct_upload: true
  - f.object.attachments.each do |attach|
    = f.hidden_field :attachments, value: attach.signed_id, multiple: true
    = image_tag attach.preview(resize_to_limit: [100, 100]) if attach.previewable?
    = image_tag attach.variant(resize_to_limit: [100, 100]) if attach.variable?
person Ccastillop    schedule 12.10.2019