webentwicklung-frage-antwort-db.com.de

Wie übertrage ich Daten mit JQuery an Rails?

Ich versuche eine jquery ajax PUT-Anfrage zu senden, die folgendermaßen aussieht:

$.ajax({
          type: "PUT",
          url: '/admin/pages/1.json',
          data: { page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});

ich erhalte jedoch die folgende Fehlermeldung:

The error occurred while evaluating nil.name
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:29:in `merge_element!'
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:18:in `parse'
    (__DELEGATION__):2:in `__send__'
    (__DELEGATION__):2:in `parse'
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/hash/conversions.rb:154:in `from_xml' ... ...

Ist wie Rails versucht die Params als XML zu analysieren, aber ich möchte JSON verwenden !!

Was soll ich tun, um JSON auf Schienen zu bringen?

49
Macario Ortega

PUT und DELETE werden nicht von allen Browsern unterstützt. RubyOnRails unterstützt die Übergabe eines zusätzlichen Parameters mit Ihren Daten namens _method , der angibt, wie RoR die Anforderung behandelt.

$.ajax({
          type: "POST",
          url: '/admin/pages/1.json',
          data: { _method:'PUT', page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});
84
duckyflip

Der Parameter dataType in jQuery ist nicht das, was Sie senden, sondern gibt das Format an, von dem Sie erwarten, dass answer ist (ja, das ist ein sehr schlechter Name). Wenn Sie Ihre Daten in einem anderen Format als application/x-www-form-urlencoded an den Server senden möchten, sollten Sie contentType param verwenden. Sie müssen auch Ihre data serialisieren:

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: JSON.stringify({...}),
      contentType: 'application/json', // format of request payload
      dataType: 'json', // format of the response
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});
36
lqc

Ok, meine JSON-Daten hatten eigentlich keinen Seitenschlüssel, mein Fehler. Deshalb wurde es nicht richtig analysiert. Aber jetzt bekomme ich "[object Object]" - Zeichenkette als Wert für den Seitenschlüssel anstelle eines schön geparsten Json-Objekts.

Wo soll ich hinschauen: JQuery oder Rails?

BEARBEITEN:

Ich habe mein Problem mit einem Skript gelöst, das das Json-Objekt mit einem hier gefundenen Skript verschlüsselt hat: www.json.org/js.html:

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: { page : JSON.stringify( {...} ) },
      dataType: 'json',
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});

Auf der Rails-Seite muss ein Json-Edelstein benötigt werden. Im Controller:

 params[:page] = JSON.parse params[:page] if params[:page].is_a? String
5
Macario Ortega

Ich hatte ein ähnliches Problem [object Object] mit jQuery/Rails, jedoch mit HTML und nicht mit JSON. Vielleicht hilft das -

parameter von [object Object]

data: { lesson: { date: drop_date } }

parameter von lesson[date]

data: { "lesson[date]": drop_date }

hoffe das hilft -

1
theschmitzer
var id = $('#route_id').val()
$.ajax({
    type: 'PUT',
    url:  '/routes/'+ id,
    data: $('#markerform').serializeArray(),
    dataType: "JSON",
    success: function(data) {
        console.log(data);
    }
});
1

Sie müssen wahrscheinlich nur die Request-Header in jQuery festlegen.

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {
    xhr.setRequestHeader("Accept", "text/javascript");
  }
})
0