#ruby-on-rails #ruby #ruby-on-rails-3 #forms #webforms
#ruby-on-rails #ruby #ruby-on-rails-3 #формы #веб-формы
Вопрос:
У меня есть классическая форма rails 3 с полем файла, все работает нормально, загрузка выполняется, и данные сохраняются в базе данных.
Когда проверка завершилась неудачей, например, заголовок отсутствует, пользователь отправляется обратно в форму с render :action => new
. Нормальный. Но проблема здесь в том, что пользователю приходится в другой раз выбирать свой файл.
Есть ли способ избежать этого?
Ответ №1:
Обычно вы не хотите обрабатывать файлы до завершения проверок или собираетесь повторно сохранять файлы, которые, возможно, не имеют связанных записей. Это делают такие драгоценные камни, как Paperclip и attachment_fu.
Если вы предпочитаете сохранить файл при его первой отправке и он является действительным, вы можете сохранить файл, а затем выполнить быструю проверку в своем представлении, чтобы увидеть, установлено ли оно уже для объекта, для которого вы создаете форму, например:
<% unless foo.attachment? %>
# file field
<% end %>
Имеет смысл?
Комментарии:
1. Хороший момент. Также может быть реализована проверка на стороне клиента или ajax
Ответ №2:
Вы не можете. Это проблема безопасности.
Вы можете взломать это в некоторых браузерах, но обычно вы не можете этого сделать
Ответ №3:
Я знаю, что вопрос устарел, но теперь у драгоценного камня carrierwave есть что-то, что позволяет сохранить поле файла при сбое проверки.
https://github.com/carrierwaveuploader/carrierwave#making-uploads-work-across-form-redisplays
В принципе, вам нужно будет добавить hidden_field avatar_cache, если в вашей модели установлен загрузчик для файла avatar. Вам нужно будет добавить его в список разрешений в контроллере (чтобы Rails не ограничивал отправку поля на сервер)