2016-04-21 11 views
0

「保存」ボタンをクリックすると、2つのエントリが作成されます。 1つは:マップ情報が格納され、もう1つは欠落していて、どちらも同じ:nameです。保存する完全なエントリだけを取得するにはどうすればよいですか?DBへのダブルフォーム提出の原因となるDropzone

new.html.erb

<%=form_for [@location, @floor], html: {class: "dropzone", multipart: true, id: "map-upload"} do |f|%> 
    <div> 
    <%=f.label :name%> 
    <%=f.text_field :name%> 
    </div> 

    <div class="fallback"> 
    <%=f.label :map%> 
    <%=f.file_field :map%> 
    </div> 

    <%=f.submit "Save", id: "floor-submit"%> 
<%end%> 

ドラッグdrop.js

$(document).ready(function() { 
    // disable auto discover 
    Dropzone.autoDiscover = false; 

    var mapUpload = new Dropzone("#map-upload", { 
    paramName: "floor[map]", 
    autoProcessQueue: false, 
    maxFiles: 1, 
    addRemoveLinks: false, 
    dictDefaultMessage: 'Drag & drop a map image file here, or click here to select file to upload', 
    }); 

    $('#map-upload').submit(function(e){ 
    mapUpload.processQueue(); 
    }); 
}); 

floor_controllerの関連部分:

def create 
    @floor = current_user.company.locations.find(params[:location_id]).floors.create(floor_params) 

    if @floor.save 
     flash[:notice] = "Floor has been created." 
     redirect_to location_floors_path 
    else 
     flash[:alert] = "There was an error saving the floor, please try again" 
     render 'new' 
    end 
    end 

モデル

class Floor < ActiveRecord::Base 
    belongs_to :location 

    has_attached_file :map 
    validates_attachment_content_type :map, :content_type => /\Aimage\/.*\Z/ 
end 

答えて

0

私はあなたのjsが一度それを提出しており、あなたのレールフォームがそれを2回目に提出していると思います。そのうちの1つを無効にすることをお勧めします。

+0

私は同意します。私が.preventDefault()フォームを送信した場合、私はインデックスにリダイレクトできません。 .processQueue()をキャンセルすると、イメージはアップロードされません。そこに私のジレンマがあります。 –

+0

私はあなたがまだあなたのjからのインデックスアクションへのリダイレクトを追加するだけでフォームのデフォルトを防止すると思います。例えばlocation.href =/processqueueの後のインデックス。 –

+0

申し訳ありませんが、私は自分のレールコントローラのインデックスメソッドへのリダイレクトを意味しました。ユーザーアカウントのparamが必要なので、jQueryを使って単純なリダイレクトを行うことはできません。 –

関連する問題