我在一个Rails3项目中有一个Activerecord模型,我正在尝试上传多个文件附件,我使用MySQL作为数据库。
在当前版本的Carrierwave it talks about中,现在可以在一个数组或Json类型的ActiveRecord字段中存储多个上传的文件-所以我正在尝试使用这种方法,但我不清楚如何实现它。
在所有的教程/railscasts/SO问题中,我只发现人们使用更传统的has_many关系来链接到单独的附件记录。
在我的例子中,我有一个发票记录,其中每个发票都需要有多个"jobfile“附件,并且我遵循Carrierwave自述文件中的示例。
我已经在模型中添加了一个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[: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 (或数组)字段来上传多个文件的工作示例?
发布于 2015-03-13 11:01:47
所以我认为问题在于MySQL不支持Json或数组字段类型,所以看起来当前的Carrierwave实现只适用于PostgreSQL。
不知怎么的,我的迁移没有抛出错误,而是默默地创建了一个字符串字段-允许单个文件上传,但不允许多个文件上传。
当我试图在一个新的VM中从头开始复制整个过程时,它确实抛出了一个有意义的错误,使得这个问题变得非常明显。
发布于 2015-09-10 12:56:25
这个问题是因为SQLite3或MySQL没有列类型json,这在PostgreSQL中是可能的。因此,您可以尝试将类型从json更改为text
class AddJobfileToInvoice < ActiveRecord::Migration
def change
add_column :invoices, :jobfile, :text
end
end在我的情况下,它是有效的。
https://stackoverflow.com/questions/28979734
复制相似问题