在我的rails应用程序中,我希望用户能够一次上传多个文件。
我正在使用carrierwave gem
gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'
在可能支持multiple: true
在我的互联网上找到绝望,在我的模型中为我的附件添加了optional: true
。
我正在使用mysql所以我不能在我的数据库中使用数组类型,但我在has_many
和{{1}之间设置了belongs_to
,Request
关系在我的数据库中。
我的表格:
Request_Attachment
我的控制器
<%= f.fields_for :request_attachments do |ra| %>
<div class="row" id="uploader">
<div class="col-xs-12">
<label class="btn btn-info"> Upload Files
<%= ra.file_field :file, multiple: true, name: "request_attachments[file][]", :style => "display: none" %>
</label>
</div>
</div>
<% end %>
我的模特:
请求:
@request = Request.new(request_params)
if @request.save
if params[:request][:request_attachments]
params[:request][:request_attachments]['file'].each do |f|
@request_attachment = @request.request_attachments.create!(:file => f)
end
end
flash[:success] = "Your request was submitted successfully, check your email for a confirmation message."
redirect_to action: 'index', status: 303
else
render :new
end
def request_params
params.require(:request).permit(:jobtitle, :requester, :status, request_attachments_attributes: [:id, :request_id, :file])
end
Request_Attachments:
class Request < ApplicationRecord
has_many :request_attachments
accepts_nested_attributes_for :request_attachments
end
我尝试了表单的各种变体,例如取出class RequestAttachment < ApplicationRecord
mount_uploader :file, FileUploader
belongs_to :request, optional: true
end
部分。
当我删除name
部分时,它会完美运行,但它不适用于multiple: true
选项。
我不太确定问题出在哪里,所以任何帮助都会很棒。
现在发生的是请求被保存,但是
仅创建了1个request_attachment,
request_attachment的文件名为multiple
答案 0 :(得分:0)
好的,我想我明白了。
我做了一些更改,这引起了错误,我仔细查看了参数哈希,我注意到它看起来像这样:
{"utf8"=>"✓",
"request"=>
{"jobtitle"=>"Testing, again and again, and again",
"request_attachments_attributes"=>
{"0"=>
{"file"=>
[#<ActionDispatch::Http::UploadedFile:0x007fee9df806b8
@content_type="image/gif",
@headers="Content-Disposition: form-data; name=\"blah\"; filename=\"logo1.gif\"\r\nContent-Type: image/gif\r\n",
@original_filename="logo1.gif",
@tempfile=blah,
#<ActionDispatch::Http::UploadedFile:0x007fee9df80690
@content_type="image\gif",
@headers=
"Content-Disposition: form-data; name=\"blah\"; filename=\"Blah.gif\"\r\nContent-Type: image/gif\r\n",
@original_filename="Blah.gif",
@tempfile=blahblah]}}
我注意到了"0"=>
并且想到了等待......在那做什么?....
所以我删除了表单中的name
部分,并将控制器更改为:
if @request.save
params[:request][:request_attachments_attributes]["0"]['file'].each do |f|
@request_attachment = @request.request_attachments.create!(:file => f)
end
这似乎有效。