2016-10-11 18 views
0

私のレールアプリでは、複数のファイルを一度にアップロードできるようにしたいと考えています。CarrierwaveマルチファイルアップロードRails 5が動作しない

私はおそらく私の取り付けのための私のモデルでoptional: trueの必要な追加についての私のインターネット検索絶望で見つけたmultiple: true

をサポートmasterブランチでcarrierwave宝石

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

を使用しています。

私は、データベース内の配列型を使用することはできませんので、私は、MySQLを使用していますが、私は私のデータベース内RequestRequest_Attachmenthas_manybelongs_to関係を設定しました。

私形式:

<%= 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 

私のモデル:

要求:

class Request < ApplicationRecord 

    has_many :request_attachments 
    accepts_nested_attributes_for :request_attachments 
end 

Request_Attachments:

class RequestAttachment < ApplicationRecord 
    mount_uploader :file, FileUploader 
    belongs_to :request, optional: true 
end 

私はname部分を取り出すのと同じように、フォームのバリエーションを試しました。

multiple: true部分を削除すると完全に機能しますが、multipleオプションでは機能しません。

問題がどこにあるかはわかりません。だから、どんな助けでもいいと思います。

今何が起こっていることは要求が保存されますということですが、

  1. のみ1 request_attachmentが作成され、

  2. request_attachmentのファイル名がnil

+0

この例を見てください:http://stackoverflow.com/questions/21411988/rails-4-multiple-image-or-file-upload-using-carrierwave – AytanLeibowitz

+0

@AytanLeibowitz私はそのコードを何度も見ました今、それは私のために働かないので、この質問。 – Avir94

答えて

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]}} 

.. ...がやっていること何です....

だから私は自分のフォームでname部分を除去し、このように見えるために私のコントローラを変更:?

if @request.save 
    params[:request][:request_attachments_attributes]["0"]['file'].each do |f| 
     @request_attachment = @request.request_attachments.create!(:file => f) 
    end 

それはうまくいったようです。

+0

'name'属性をフォームに入れておけば、コントローラは' params [:request_attachments] ['file']のように見えますが、それぞれdo | f | 'は少しシンプルです – Avir94

+0

投稿したばかりのことを実証したあなたがそれを理解してうれしい! – AytanLeibowitz

関連する問題