【问题标题】:Rails / Carrierwave: Multiple files get overwrittenRails / Carrierwave:多个文件被覆盖
【发布时间】:2020-04-15 16:31:29
【问题描述】:

我正在按照https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md#multiple-file-uploads上的说明进行操作

特别是这条线给我带来了麻烦(我认为):

<% user.avatars.each do |avatar| %>
  <%= hidden_field :user, :avatars, multiple: true, value: avatar.identifier %>
<% end %>
<%= form.file_field :avatars, multiple: true %>

我有一个名为 properties 的表和一个名为 property_units 的相关表,它们是使用 Cocoon gem 的属性上的嵌套字段。

property_units 有载波文件列。

对于我在视图上输入的文件,我有以下内容:

_property_unit_fields.html.erb

        <% if f.object.files.count > 0 %>
            <div class="uploaded-files">
                <% f.object.files.each do |file| %>
                    <%= f.hidden_field :files, multiple: true, value: file.file.identifier %>
                    <p>
                        <span><%= file.file.filename %></span>
                    </p>
                <% end %>
            </div>
        <% end %>
        <%= f.file_field :files, multiple: true %>
        </div>

上述案例中的f 来自这个 Cocoon 实现:

    <div id="property_units">
     <%= f.fields_for :property_units do |unit| %>
        <%= render 'property_unit_fields', f: unit %>
      <% end %>
      <div class='links'>
        <%= link_to_add_association 'Add Unit', f, :property_units, class: 'button button--tertiary' %>
      </div>
    </div>

我能够保存文件,并且安装的上传器可以正常工作。我可以保存多个,但如果我再次上传,以前的文件将被完全替换。

例如,我刚刚上传了一个名为“tickets.pdf”的文件。该文件在数据库中。

隐藏的输入呈现为:

&lt;input multiple="multiple" value="tickets.pdf" type="hidden" name="property[property_units_attributes][0][files][]" id="property_property_units_attributes_0_files"&gt;

一旦我上传了一个新文件,“tickets.pdf”就会被删除。

我做错了什么?

编辑,这是上传时的日志

已存在并在隐藏输入中引用的文件是tickets.pdf,新上传的文件是ActionDispatch

很明显,它正在发送一个字符串,而 Carrierwave 需要一个文件。但这就是文档规定要做的事情。所以我不知道还应该在请求中放置什么

"files"=>["tickets.pdf", #<ActionDispatch::Http::UploadedFile:0x00007fd6dc275118 @tempfile=#<Tempfile:/tmp/RackMultipart20200415-3213-10sfy1b.pdf>, @original_filename="somefile.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name=\"property[property_units_attributes][0][files][]\"; filename=\"somefile.pdf\"\r\nContent-Type: application/pdf\r\n">], "_destroy"=>"false", "id"=>"1"}},

所以现在“somefile.pdf”是我拥有的唯一文件,在 DB 列中它看起来像 {NULL,"\"somefile.pdf\""}

NULL 是门票

【问题讨论】:

标签: ruby-on-rails carrierwave


【解决方案1】:

【讨论】:

  • 我发布的链接开头说“CarrierWave 还可以方便地支持多个文件上传字段。”。我不确定如何手动执行此逻辑,因为这些字段是嵌套属性的一部分。而且在示例之前的链接上,他们写道“如果你想在上传新文件时保留现有文件,你可以这样:”
  • 您可以在尝试“一旦我上传新文件后,“tickets.pdf”将被删除。”时发送 development.log。
  • 确定一秒钟。此外,DB 列会发生以下情况:{NULL,"\"somefile.pdf\""}。发生这种情况是因为我想我正在那个隐藏的输入中发送一个字符串。但这就是文档的内容。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多