Carrierwave在重新显示后会持续上传

时间:2015-10-05 10:38:59

标签: ruby-on-rails carrierwave cocoon-gem

我需要让rails记住用户在表单验证失败后选择上传的文件并重新显示表单。我想我已经阅读了关于这个主题的网络上的每篇文章都没有取得任何成功。

我发现的最佳和最完整的解决方案是: http://www.liooo.engineer/blog/2014/11/22/building-multiple-file-upload-form-in-rails-way/

https://github.com/Liooo/carrierwave-cocoon-file-upload-app-demo

我已经从git克隆了该项目,在本地运行它是的确有效但是当验证失败时,会记住附件,但文件上传框仍显示“未选择文件”。这很令人困惑。

有没有人设法让rails + carrierwave在验证失败时保留文件上传,而不会显示混乱的消息。

点击此处查看截图。 https://disqus.com/by/disqus_828B8YcIJd/

更新

我已经设法部分地解决了这个问题,我希望有人可以了解正在发生的事情。

形式

<%= form_for(article, html: { id: "discussion-form" }, remote: true ) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, rows: 5, placeholder: "What do you want to discuss?", minlength: 10, maxlength: 1000 %>
  </div>
  <%= render partial: "attachments_form", locals: {f: f} %>
  <%= f.submit "Start discussion", class: "btn btn-success" %>
<% end %>

attachments_form

<%= f.fields_for :attachments do |builder| %>
  <% render 'attachment_fields', f: builder %>
<% end %>
<%= link_to_add_association "Add an attachment", f, :attachments %>

attachment_fields

<%= f.file_field :attachment, :multiple => false, accept: 'image/jpeg,image/gif,image/png' %>
<%= f.hidden_field :attachment_cache, :value => f.object.attachment_cache %>
<%= f.hidden_field :id %>
<%= f.hidden_field :_destroy %>
<%= link_to_remove_association "remove", f %>

这确实有效并且在验证错误时在表单重新显示之间保留所选文件。如果我更改“attachments_form”以将表单调用包装在div中,它将停止工作。

attachments_form - 停止工作

<div id="tasks">
  <%= f.fields_for :attachments do |builder| %>
    <% render 'attachment_fields', f: builder %>
  <% end %>
  <%= link_to_add_association "Add an attachment", f, :attachments %>
</div>

0 个答案:

没有答案