Rails 5 ActiveStorage: Почему моя форма забывает выбранный файл, когда страница перерисовывается? - PullRequest
0 голосов
/ 11 апреля 2019

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

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

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

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

File is selected

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

File is no longer selected

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

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Это распространенная проблема с браузером Вы можете думать это как -

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

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

Таким образом, на странице редактирования вы должны явно просмотреть 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%>
0 голосов
/ 11 апреля 2019

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

<%= 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 %>
...