如何让多个文件上传在 Rails 5 中工作?
How can I get multiple file uploads working in Rails 5?
我的控制器中有以下内容在 Rails 4 中运行良好:
def create_multiple
params[:documents].map do |document|
if document[:upload]
doc = Document.new
doc.upload = document[:upload]
doc.category_id = @category.id
doc.save
end
end
redirect_to @category, notice: 'Documents saved'
end
现在,升级到Rails5后,就不行了。我强烈怀疑这是因为 params is now an Object, rather than HashWithIndifferentAccess,但我不知道如何使多文件上传再次工作。
试过这个:
params.to_unsafe_h[:documents].map do |document|
但是随后它失败了 no implicit conversion of Symbol into Integer
if document[:upload]
部分。
关于我如何推进这件事有什么想法吗?
好的,我不得不重新设计我的表格,使其更 "railsy" 才能在 Rails 5 中工作,在 Slim 中(在 new_multiple 视图中):
= form_tag create_multiple_category_documents_path(@category), multipart: true do
.row.bottom30
- @documents.each_with_index do |document, ndx|
= fields_for 'documents[]', document, index: ndx do |f|
.col-xs-12.col-sm-6.col-md-4.bottom30
=> f.label :title
= f.text_field :title, class: 'form-control'
= f.file_field :upload
这是控制器中现在的内容:
def new_multiple
@documents = 20.times.map { @category.documents.build }
end
def create_multiple
params[:documents].each do |num, document|
unless document[:upload].blank?
doc = Document.new
doc.upload = document[:upload]
doc.category_id = @category.id
doc.save
end
end
redirect_to @category, notice: 'Documents saved'
end
可能有更好的方法来执行此操作,但目前有效。
我的控制器中有以下内容在 Rails 4 中运行良好:
def create_multiple
params[:documents].map do |document|
if document[:upload]
doc = Document.new
doc.upload = document[:upload]
doc.category_id = @category.id
doc.save
end
end
redirect_to @category, notice: 'Documents saved'
end
现在,升级到Rails5后,就不行了。我强烈怀疑这是因为 params is now an Object, rather than HashWithIndifferentAccess,但我不知道如何使多文件上传再次工作。
试过这个:
params.to_unsafe_h[:documents].map do |document|
但是随后它失败了 no implicit conversion of Symbol into Integer
if document[:upload]
部分。
关于我如何推进这件事有什么想法吗?
好的,我不得不重新设计我的表格,使其更 "railsy" 才能在 Rails 5 中工作,在 Slim 中(在 new_multiple 视图中):
= form_tag create_multiple_category_documents_path(@category), multipart: true do
.row.bottom30
- @documents.each_with_index do |document, ndx|
= fields_for 'documents[]', document, index: ndx do |f|
.col-xs-12.col-sm-6.col-md-4.bottom30
=> f.label :title
= f.text_field :title, class: 'form-control'
= f.file_field :upload
这是控制器中现在的内容:
def new_multiple
@documents = 20.times.map { @category.documents.build }
end
def create_multiple
params[:documents].each do |num, document|
unless document[:upload].blank?
doc = Document.new
doc.upload = document[:upload]
doc.category_id = @category.id
doc.save
end
end
redirect_to @category, notice: 'Documents saved'
end
可能有更好的方法来执行此操作,但目前有效。