2010-02-09 6 views
5

Ich habe ein bisschen Mühe, die jQuery Form Plugin ordnungsgemäß mit einem Datei-Upload-Feld zu arbeiten. Wenn ich das Plugin verwende, um das Formular ohne ein Datei-Upload-Feld zu senden, wird der format.json-Teil des respond_to do |format|-Blocks ordnungsgemäß aufgerufen. Durch das Hinzufügen des Datei-Upload-Felds wird jedoch nur der format.html-Teil ausgeführt, wodurch mein JavaScript-Code denkt, dass ein Fehler aufgetreten ist.Mit Antwort_to ... format.json und jQuery Form Plugin von malsup

Hat irgendjemand schon mal davor gelandet oder kennt einen Weg, um das Plugin dazu zu zwingen immer json zu benutzen? Kann ich alternativ die URL ändern, die das Plugin verwendet, um Rails zum Rendern des JSON zu zwingen?

Vielen Dank für jede Hilfe! Code unten:

Antwort

1

Anscheinend ist das Setzen von Accept header nicht möglich, wenn ajaxSubmit verwendet wird und eine Datei hochgeladen wird.

Siehe die antwort von malsup in diesem thread here.

Er sagt:

Das Hochladen von Dateien verwendet Ajax nicht, nur die Form Plugin macht es, dass Weg erscheinen. Beim Hochladen einer Datei findet ein echter Browser-Submit statt.

+0

Ich habe versucht, die Accept-Header im Callback vor beforeSend, aber das hatte keine Auswirkungen. Wenn ich den Code von jQuery.form sah, hat das XHR-Objekt, das an preferSend übergeben wurde, eine leere Funktion initialisiert auf "setRequestHeader". Allerdings schaue ich auf 2.16 Version der Datei, vielleicht gibt es Änderungen in den späteren Versionen. – Prashant

1

Können Sie den Beitrag auf dem Server mit Firebug untersuchen, und fügen Sie die Anforderungsheader hier ein. Wir versuchen zu sehen, dass der Accept-Header auf json gesetzt ist. Welche Version von Schienen verwendest du?

+0

Leider, dass ein Teil des Problems ist. Es scheint, dass das Plugin einen iframe verwendet, um das Formular zu senden, daher wird es nicht in Firebug angezeigt (ich bin nicht wirklich sicher, dass dies das Problem ist, aber es wird nicht angezeigt, und ich weiß, dass es einen iframe verwendet ...). Wenn es ordnungsgemäß funktioniert, verifizierte ich, dass die Kopfzeile auf Json festgelegt ist. Oh, und ich benutze Rails 2.3.5. –

1

Ich bin mir immer noch nicht sicher, warum es nicht funktioniert, aber ich habe viele Dinge ausprobiert und schließlich die Lösung gefunden.

Ich habe versucht, die URL durch Hinzufügen .json an das Ende, die Rails zum Rendern der format.json Block, aber es verwirrte meinen Browser, indem es denken, ich wollte eine Datei herunterladen wollte.

Also habe ich dann versucht, die URL zu ändern, indem Sie den Parameter ?format=json übergeben, die leider genau das gleiche getan hat.

Schließlich habe ich versucht, das format.json nur format.js (Javascript) zu ändern und das Hinzufügen von .js auf die URL, aber immer noch die gleichen render :json => ... verwenden, die ich mit der Einstellung der dataType Parameter in meinem jQuery Aufruf json vor zusammen hatte. Dies scheint zu funktionieren, obwohl es nicht die optimale Lösung ist.

Ich hoffe, dass jemand anderes das nützlich findet. Ich werde wieder posten, wenn ich eine richtige Antwort finde. In der Zwischenzeit, wenn jemand eine richtige Antwort hat, lass es mich wissen und ich werde deine akzeptieren!

+0

Funktioniert einwandfrei in Firefox, aber es gibt eine Warnung in Safari (5.0.5). –

7

Mehrere Dinge sind erforderlich, damit das jQuery Form-Plugin für Dateiuploads mit einer JSON-Antwort funktioniert. Im JavaScript aktivieren, sollten die Optionen für .ajaxForm haben:

dataType: 'json', // evaluate return as JSON 

Der Browser-Inhalte als JSON, einen Weg zurück, um die Rails Aktion sagen, muss dies zu tun, ist ein verstecktes Format Eingabefeld in der Datei hinzufügen Upload-Formularvorlage:

Die Rails-Aktion führt dann die format.json-Methode innerhalb des repand_to-Blocks aus.

Im Server-Aktion

  • encapsulate JSON in einem Tag, .ajaxForm wird die Zeichenfolge und eval JSON richtig
  • Satz Rückkehr Inhaltstyp „text/html“ auspacken, sonst einige Browser (Firefox) versucht, die Rückgabe in eine Datei herunterzuladen.

z.B.

respond_to do |format| 
    format.json { 
      render :json => "<textarea>#{data.to_json}</textarea>", :content_type => "text/html" 
    } 
    } 
2

Ich habe eine Abhilfe für dieses Problem. Getestet habe ich diese Lösung nur mit Rails 3, aber vielleicht funktioniert es auch für die 2.3.x

Die Lösung ist sehr einfach:

!#javascript 

$('form#my_form').live('submit',function(){ 
$(this).ajaxForm({ dataType: "script", success: processJson}) 
return false; 
}) 

//data arrive as a string but we can parse it correctly 

function processJson(data, statusText, xhr, $form){ 
my_data_parsed = JSON.parse(data); 

    } 

!#ruby 
def create 
.... 
render :js => { :status => false,:messages => @myobject.errors.full_messages}.to_json 

end 
Verwandte Themen