#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. Как вы отображаете имя файла?