Rails 5 ActiveStorage: почему моя форма забывает выбранный файл при повторном отображении страницы?

#ruby-on-rails #rails-activestorage

#ruby-on-rails #rails-activestorage

Вопрос:

Я использую активное хранилище для реализации загрузки файлов в форме.

 <%= form_for @listing do |form| %>
  # ...
  <%= form.text_field :title, placeholder: "Title" %>
  <%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
  # ...
<% end %>
  

Я обрабатываю отправку формы в контроллере следующим образом:

   def create
    @listing = Listing.new(safe_params)
    if @listing.save
      flash[:success] = "Your posting has been submitted"
      redirect_to root_url
    else
      flash.now[:warning] = @listing.errors.full_messages
      render 'new'
    end
  end
  

Если проверки завершаются неудачно, новая страница отображается повторно. Если я уже ввел заголовок, ранее введенный заголовок присутствует в повторно отображаемой форме. Однако, если я уже выбрал файл, этот файл не выбирается в повторно отображаемой форме.

Я выбираю файл:

Файл выбран

При отправке файл загружается, но проверка завершается неудачей, и страница повторно отображается. Файл больше не выбирается:

Файл больше не выбран

Я не совсем уверен, что здесь происходит. Почему файл не запоминается при повторном отображении новой страницы? Почему форма не отображает выбранный файл? Что мне нужно сделать, чтобы убедиться, что он все еще выбран при повторном отображении страницы?

Ответ №1:

Вы могли бы попробовать что-то вроде этого:

 <%= form_for @listing do |form| %>
  # ...
  <%= form.text_field :title, placeholder: "Title" %>
  <%= form.hidden_field :image, value: form.object.image.signed_id if form.object.image.attached? %>
  <%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
  # ...
<% end %>
  

Ответ №2:

Это распространенная проблема с браузером, которую вы можете рассматривать как —

Поле файла как одностороннее поле. Браузер на сервер, но не сервер в браузер.

Это не то, как поле файла работает в любом браузере.

Итак, на странице редактирования вам нужно будет явно просмотреть file или file name в любом другом месте, чтобы пользователь знал, что файл уже присутствует, если он не хочет обновить его другим файлом.

 <%= form_for @listing do |form| %>
   #...
    <div>
      <%if form.object.image.present?%>
        #name of file
      <%end%>
    </div>
    <%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
    #..
<%end%>
  

Комментарии:

1. Как вы отображаете имя файла?