2009-05-25 6 views
15

estoy tratando de enviar una solicitud de jQuery Ajax PUT que tiene este aspecto:¿Cómo PONGO datos de JSON a Ruby on Rails usando jQuery?

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

Mi controlador se ve más o menos así:

 respond_to do |format| 
     if @page.update_attributes params[:page] 
      format.html{ ... } 
      format.json{ render :json => {:saved => 'ok'}.to_json } 
     else 
      format.html{ ... } 
      format.json{ render :json => {:saved => 'fail'}.to_json } 
     end 
     end 

pero me sale el siguiente error.

se produjo el error mientras que la evaluación 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 de análisis sintáctico' (DELEGACIÓN): 2: __send__' (__DELEGATION__):2:in en análisis sintáctico ' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/hash/conversions.rb:154:in `from_xml' ... ...

Es como si Ruby on Rails estuviera intentando analizar los parámetros como XML, pero quiero usar JSON.

¿Qué debo hacer para poner JSON en Ruby on Rails?

+1

actualización de su pregunta original mediante la edición que en vez de pedir una nueva pregunta: http://stackoverflow.com/questions/907910/how- do-i-put-data-to-rails-using-jquery – tvanfosson

Respuesta

5

Debe configurar contentType en sus opciones. contentType es lo que estás enviando. dataType es lo que esperas volver. Debe leer detenidamente el documentation on the options argument to ajax.

+0

datos también deben ser serializados. Ver mi respuesta –

7

Configurar el contentType no funcionó para mí. Estaba obteniendo una cadena en lugar de un hash para params [: page].

Así que lo resolvió así:

Stringifying el objeto JSON con un guión que se encuentra en JSON en JavaScript:

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

En el rubí en los carriles laterales, debe exigirse una joya JSON . En el controlador:

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

No es bastante en absoluto, sino que trabajó para mí.

+0

Tenga cuidado con esto - PUT no es compatible con todos los navegadores. Algunos solo hacen GET y POST, no estoy seguro de cuál. – skaffman

+0

Rails realizará automáticamente el análisis si configura contentType. Ver mi respuesta –

2

Si no desea agregar secuencias de comandos, se puede hacer

$.parseJSON("some_jsonish_string") 
1

Es necesario establecer contentType a "application/json" en sus opciones; dataType es solo lo que esperas volver.

Además, es necesario para serializar su campo data usando JSON.stringify:

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