2009-05-25 11 views
48

Sto cercando di inviare una richiesta PUT jquery ajax che assomiglia a questo:Come faccio a mettere i dati a Rails utilizzando jQuery

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

ma ottengo il seguente errore:

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

è come Rails sta cercando di analizzare i parametri come XML, ma voglio usare JSON !!

Cosa devo fare per mettere JSON su rotaie?

risposta

84

PUT e DELETE non sono supportati da tutti i browser, RubyOnRails supporta passando un parametro in più con i tuoi dati chiamati _method che indicherà come RoR tratterà la richiesta.

+3

che non sembra essere il problema qui (e fare qualsiasi browser web moderno davvero manca il supporto per PUT?). Il server/sta/sta ricevendo i dati, solo che non li analizza nel modo giusto. –

+2

sì la maggior parte dei browser manca PUT e DELETE, solo GET e POST. Il server potrebbe ricevere i dati sull'azione sbagliata, ad es. se è un POST, normalmente si assocerà all'azione Crea e un PUT si assocerà all'azione Aggiorna. – Kris

+5

http://annevankesteren.nl/2007/10/http-method-support mi avrebbe fatto credere diversamente (cioè che molti browser effettivamente supportano PUT e DELETE). – mogsie

5

Ok, in realtà i miei dati JSON non avevano la chiave della pagina, errore mio. Ecco perché non stava analizzando correttamente. Ma ora ottengo la stringa "[oggetto Object]" come valore per la chiave di pagina invece di un oggetto json piacevolmente analizzato.

Dove devo cercare: JQuery o Rails?

EDIT:

Ho risolto il mio problema stringifying l'oggetto JSON con uno script trovato qui: 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); 
     } 
}); 

sulla gemma rotaie lato JSON deve essere richiesto. Nel controllore:

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

Ottengo JSON.strigify non definito, c'è una lib di JQuery da includere? – Kris

+0

Questo è un errore di battitura. Dovrebbe essere "stringify". – Dylan

+0

Il mio problema è anche se il database è in fase di aggiornamento, la richiesta rimane in attesa. – Alex

1

Ho avuto un problema simile [object Object] con jQuery/rotaie, ma con HTML, piuttosto che JSON. Forse questo aiuterà -

param di [object Object]

data: { lesson: { date: drop_date } } 

param di lesson[date]

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

speranza che questo aiuta -

35

Il dataType param in jQuery non è ciò che si invia, ma piuttosto specifica il formato che ti aspetti dalla risposta (sì, questo è av Ehm, povero nome). Se si desidera inviare i dati al server in un formato diverso da application/x-www-form-urlencoded, è necessario utilizzare il parametro contentType. È inoltre necessario per serializzare il vostro 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

Probabilmente solo bisogno di impostare le intestazioni di richiesta su 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); 
    } 
}); 
Problemi correlati