我在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(或数组)字段上传多个文件的工作示例吗?
答案 0 :(得分:1)
所以我认为问题是MySQL不支持Json或Array字段类型,所以看起来当前的Carrierwave实现只适用于PostgreSQL。
不知怎的,我的迁移过程没有引发错误,而是默默地创建了一个字符串字段 - 允许单个文件上传工作但不能多个文件上传。
当我尝试在新VM中从头开始复制整个过程时,确实会产生一个有意义的错误,使问题变得非常明显。