Carrierwave多文件上传Rails 5无法正常工作

时间:2016-10-11 21:57:55

标签: mysql ruby-on-rails carrierwave ruby-on-rails-5

在我的rails应用程序中,我希望用户能够一次上传多个文件。

我正在使用carrierwave gem

gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'

在可能支持multiple: true

的主分支上

在我的互联网上找到绝望,在我的模型中为我的附件添加了optional: true

我正在使用mysql所以我不能在我的数据库中使用数组类型,但我在has_many和{{1}之间设置了belongs_toRequest关系在我的数据库中。

我的表格:

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. 仅创建了1个request_attachment,

  2. request_attachment的文件名为multiple

1 个答案:

答案 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

这似乎有效。