Как сохранить значение поля файла при сбое проверки

#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 не ограничивал отправку поля на сервер)