2011-01-06 7 views
7

Ich entwickle eine Rails-Anwendung, bei der Formulare mit formtastic generiert wurden. Ich entwickle & lokal testen - das ist - auf localhost: 3000 w/Ruby-1.9.2, Rails-3.0.1, jQuery und AJAX.Schienen 3: Formular wird zweimal gesendet

Unten ist ein Beispiel Bildschirmausgabe des Problems, das ich sehe. Meine Formulare werden zweimal innerhalb von 1 Sekunde gesendet. Ich kann nicht verstehen, warum das passiert. Ich sehe dieses Problem mit allen Anfragen - einschließlich GET.

  1. Gestartet POST "/ Unternehmen/6/edit_balance" für 127.0.0.1 bei 2011-01-07 02.31.47 0530 Verarbeitung von BusinessesController # edit_balance als JS Parameter: {“ UTF-8 "=>" ✓“, "authenticity_token"=> "zcWH08sV8kPbAYy7JQX64Cu2e1i/kEB1AB4x5a08CO8 ="

  2. POST Started "/ Unternehmen/6/edit_balance" für 127.0.0.1 bei 2011-01-07 2.31: 48 +0530 Verarbeitung von BusinessesController # edit_balance als JS Parameter: { "UTF-8" => "✓", "authenticity_token" => "zcWH08sV8kPbAYy7JQX64Cu2e1i/kEB1AB4x5a08CO8 ="

Und so frage ich, ob ich einen grundlegenden Programmierfehler mache. Wenn ja, könnten Sie bitte einige Lösungen vorschlagen, die ich ausprobieren könnte.

+1

bitte liefern Sie die View-Datei – apneadiving

+0

könnten Sie das lösen? Ich habe derzeit das gleiche Problem – pduersteler

Antwort

1

Wenn Sie das Formular mit Javascript senden, versuchen Sie, die Übermittlungsschaltfläche zu deaktivieren, wenn das Formular gesendet wird. Mit jQuery wäre es so etwas wie dieses (nicht getestet) sein:

$('form').submit(function(){ 
    $(this).find(input[type='submit']).attr("disabled", "true"); 
    ... // submit form via AJAX 
    return false; 
}); 
+0

Form.attr ("action", ...) setzt nur das "action" -Attribut für das Formular und bestimmt daher, wohin das Formular gesendet wird, sendet das Formular jedoch nicht wirklich. – polarblau

0

Dank PolarBlau .. Sie mir die Vorschläge Lassen Sie versuchen ..

Apnediving: Dies sind die Bit-Code, dass 1. das Formular erstellen (form partially) 2. Definieren Sie den Dialog, der die Form enthält (Dialog partiell) und 3. den JS, der dem Formular eine Aktion anfügt.

Formular Teil (credits_form)

- f.inputs :name => 'Edit Credits' do 
    = f.input :numeric_input_1, :label => 'Amount', :as => :select, :collection => [1000,2000,3000] 
    = f.input :boolean_input_1, :label => 'Add Credits' 
    = f.commit_button :label => 'Submit' 

Dialog Teil

# edit-Credits-Dialog

- @user_input = UserInput.new

= semantic_form_for @user_input, :remote => true do |f|  
= render :partial => 'businesses/credit_form', :locals => {:f => f} 

JS-Code

$.getJSON('/businesses/' + id + '/load_credits', function(data) { 
    var form = $('#edit-credits-dialog form') ; 

    form.attr('action', '/businesses/' + id + '/edit_balance') ; <-- seems to be happening twice 
    $('#edit-credits-dialog').dialog('open') ; <--- happens once 
}) ; 
+0

Deaktivieren der Schaltfläche "Senden" scheint nicht zu funktionieren. Ich sehe immer noch 2 POST-Anfragen für jeden einzelnen Klick. – Abhinav

+0

Deaktivieren der Schaltfläche "Senden" scheint nicht zu funktionieren. Ich sehe immer noch 2 POST-Anfragen für jeden einzelnen Klick. Ist es möglich, dass die zweite Anfrage auftritt, weil der Browser keine Bestätigung für die erste erhalten hat? Ich erkannte auch, dass ich den Block "respond_to" von meinem Controller entfernte und ihn nur mit einem Renderer: json ersetzte. Könnte es sein, dass die Antwort_to wichtig ist und doppelte Verarbeitung verhindert? Wenn es keine der beiden oben genannten Möglichkeiten gibt, dann bin ich geschraubt, weil ich keine dritte Idee habe. – Abhinav

+2

OK, ich habe es herausgefunden. Es gibt ein Problem mit meinen Javascript-Dateien. Ich habe dasselbe "Klick" -Ereignis zweimal am selben Objekt gebunden. Und anscheinend - beginnend mit jQuery-1.4.2 - ist es möglich, das zu tun. Derzeit umgehe ich das Problem, indem ich $ (obj) .unbind ('click', handler) .bind ('click', handler) mache. Aber ich habe einen ganzen Abend lang den Code reorganisiert. Danke an alle für ihre Eingaben – Abhinav

8

Ich hatte das gleiche Problem direkt nach der Bereitstellung auf Heroku ... Ich pre-kompiliert meine Vermögenswerte, und plötzlich bekam ich doppelte AJAX-Einreichungen. Ich glaube, dass ich irgendwie mit doppelten JavaScript-Dateien in öffentlichen/Assets endete.

Um das Problem zu beheben, löschte ich gerade mein gesamtes public/assets Verzeichnis.

+1

Amir, danke. Ata Ga'on! Ich habe versucht, vorkompilieren und dann die Vermögenswerte zu reinigen und es hat nicht funktioniert. Aber einfach das Public/Assets Verzeichnis zu löschen, hat funktioniert! Vielen Dank! (Habe einfach 'rm -r public/assets /') – mjnissim

Verwandte Themen