Wenn die Schaltfläche "Speichern" angeklickt wird, werden zwei Einträge erstellt. Eine mit der: Karteninformationen gespeichert, und eine fehlt, beide mit dem gleichen: Name. Wie bekomme ich nur den kompletten Eintrag zum speichern?Dropzone auf Rails verursacht doppelte Formularübergabe an DB
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%>
drag-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();
});
});
relevanten Teils 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
Modell
class Floor < ActiveRecord::Base
belongs_to :location
has_attached_file :map
validates_attachment_content_type :map, :content_type => /\Aimage\/.*\Z/
end
Ich stimme zu. Wenn ich .preventDefault() auf dem Formular absende, kann ich nicht zurück zum Index umleiten. Wenn ich die .processQueue() abbringe, wird das Bild nicht hochgeladen. Darin liegt mein Dilemma. –
Ich denke, wenn Sie Standard auf dem Formular verhindern, fügen Sie immer noch nur eine Umleitung zu Index Aktion von Ihrem js. z.B. location.href =/index nach der Prozesswarteschlange. –
Es tut mir leid, ich meinte eine Umleitung zur Index-Methode meines Rails-Controllers. Es erfordert einen Param vom Benutzeraccount, so dass ich keine einfache Weiterleitung durch jQuery (oder nicht, dass ich gefunden habe) tun kann. –