2009-05-25 10 views
48

Próbuję wysłać żądanie PUT jquery ajax, który wygląda tak:Jak umieścić dane do szyn za pomocą jQuery

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

ale pojawia się następujący błąd:

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' ... ... 

jest jak Railsy próbują parsować parametry jako XML, ale chcę użyć JSON !!

Co należy zrobić, aby umieścić JSON na szynach?

Odpowiedz

84

PUT i DELETE nie są obsługiwane przez wszystkie przeglądarki, RubyOnRails obsługuje przechodzącej dodatkowy parametr z danymi zwane _method który wskaże jak RoR potraktuje wniosek.

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

To nie wydaje się być problem tutaj (i zrobić jakieś nowoczesnych przeglądarek internetowych naprawdę brakuje wsparcia dla PUT?). Serwer/otrzymuje/odbiera dane, po prostu nie parsuje go we właściwy sposób. –

+2

tak większości przeglądarek brakuje PUT i DELETE, tylko GET i POST. Serwer może pobierać dane o niewłaściwej akcji, np. jeśli jest to POST, to zwykle mapuje się do akcji Create, a PUT mapuje do akcji Update. – Kris

+5

http://annevankesteren.nl/2007/10/http-method-support mógłby mnie przekonać, że jest inaczej (tzn. Że wiele przeglądarek faktycznie obsługuje PUT i DELETE). – mogsie

5

OK, faktycznie moje dane JSON nie miały klucza strony, mój błąd. To dlatego nie był poprawnie analizowany. Ale teraz otrzymuję ciąg "[object Object]" jako wartość dla klucza strony zamiast ładnie sparsowanego obiektu json.

Gdzie powinienem wyglądać: JQuery lub Rails?

EDIT:

Mam rozwiązać mój problem stringifying obiekt json ze skryptu znaleźć tutaj: 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); 
     } 
}); 

Na gem szyny boczne json musi być potrzebnym. W regulatorze:

params[:page] = JSON.parse params[:page] if params[:page].is_a? String 
+0

Nie zdefiniowałem JSON.strigify, czy istnieje biblioteka JQuery do włączenia? – Kris

+0

To literówka. Powinno to być "stringify". – Dylan

+0

Mój problem jest mimo że baza danych jest aktualizowana, żądanie pozostaje w toku. – Alex

1

miałem podobny problem [object Object] z jQuery/szynach, ale z HTML, zamiast JSON. Może to pomoże -

param od [object Object]

data: { lesson: { date: drop_date } } 

param z lesson[date]

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

nadziei, że to pomoże -

35

dataType param w jQuery nie jest to, co wysłać, ale raczej określa format, jakiego oczekuje się, aby być odpowiedź (tak, to av niska nazwa). Jeśli chcesz wysłać swoje dane do serwera w formacie innym niż application/x-www-form-urlencoded, powinieneś użyć parametru contentType. Trzeba także szeregować swoje data:

$.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); 
     } 
}); 
0

Prawdopodobnie wystarczy ustawić nagłówki żądania na jQuery.

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) { 
    xhr.setRequestHeader("Accept", "text/javascript"); 
    } 
}) 
1
var id = $('#route_id').val() 
$.ajax({ 
    type: 'PUT', 
    url: '/routes/'+ id, 
    data: $('#markerform').serializeArray(), 
    dataType: "JSON", 
    success: function(data) { 
     console.log(data); 
    } 
}); 
Powiązane problemy