如何使用单个json / array列使用Carrierwave上传多个文件

时间:2015-03-11 06:08:47

标签: ruby-on-rails ruby-on-rails-3 file-upload carrierwave jquery-file-upload

我在Rails 3项目中有一个Activerecord模型,我试图上传多个文件附件,我使用MySQL作为数据库。

在Carrierwave it talks about的当前版本中,现在能够将多个上传的文件存储在一个ActiveRecord数组或Json类型的字段中 - 所以我试图让这种方法起作用,我&# 39;我不清楚如何实现这一点。

在所有教程/ railscasts / SO问题中,我发现人们只使用更传统的has_many关系链接到单独的附件记录。

在我的情况下,我有一张发票记录,其中每张发票都需要有多个" jobfile"附件和我在Carrierwave README中的示例。

我在模型中添加了一个json字段:

class AddJobfileToInvoice < ActiveRecord::Migration
  def change
    add_column :invoices, :jobfile, :json
  end
end

在表单视图中,我启用了多个上传

<%= form_for(@invoice, html: {class: 'invoice-form', multipart: true}) do |f| %>
.....    
<%= f.file_field :jobfile, multiple: true%>

在我发布的params中,我可以看到正确的多个上传数组params[:invoice][:jobfile],它给出了:

params[:invoice][:jobfile]
=> [#<ActionDispatch::Http::UploadedFile:0x000000065996f0     @original_filename="test1.gif", @content_type="image/gif", @headers="Content-Disposition: form-data; name=\"invoice[jobfile][]\"; filename=\"test1.gif\"\r\nContent-Type: image/gif\r\n", @tempfile=#<File:/tmp/RackMultipart20150311-33374-1cqjv3i>>, 
#<ActionDispatch::Http::UploadedFile:0x0000000659a0c8 @original_filename="test2.gif", @content_type="image/gif", @headers="Content-Disposition: form-data; name=\"invoice[jobfile][]\"; filename=\"test2.gif\"\r\nContent-Type: image/gif\r\n", @tempfile=#<File:/tmp/RackMultipart20150311-33374-15stv05>>]

然后根据Carrierwave自述文件缓存文件并保存模型

@invoice = Invoice.new(params[:invoice])
@invoice.jobfile = params[:invoice][:jobfile]
@invoice.save

但是,只要我保存发票模型,我就会收到Jobfile You are not allowed to upload nil files错误

有人可以发帖或指向一个让Carrierwave使用单个JSON(或数组)字段上传多个文件的工作示例吗?

1 个答案:

答案 0 :(得分:1)

所以我认为问题是MySQL不支持Json或Array字段类型,所以看起来当前的Carrierwave实现只适用于PostgreSQL。

不知怎的,我的迁移过程没有引发错误,而是默默地创建了一个字符串字段 - 允许单个文件上传工作但不能多个文件上传。

当我尝试在新VM中从头开始复制整个过程时,确实会产生一个有意义的错误,使问题变得非常明显。