type - rails jquery ajax
¿Cómo PUESTO datos en Rails usando JQuery? (6)
Estoy tratando de enviar una solicitud jquery ajax PUT que se ve así:
$.ajax({
type: "PUT",
url: ''/admin/pages/1.json'',
data: { page : {...} },
dataType: ''json'',
success: function(msg) {
alert( "Data Saved: " + msg );
}
});
pero me sale el siguiente error:
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'' ... ...
Es como si Rails estuviera intentando analizar los params como XML, pero quiero usar JSON !!
¿Qué debo hacer para poner a JSON en los rieles?
El dataType
en jQuery no es lo que usted envía, sino que especifica el formato que espera que sea la respuesta (sí, ese es un nombre muy pobre). Si desea enviar sus datos al servidor en un formato distinto a application/x-www-form-urlencoded
, debe usar contentType
param. También necesita serializar sus 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 );
}
});
Ok, en realidad mis datos JSON no tenían la clave de página, mi error. Entonces es por eso que no fue un análisis correcto. Pero ahora obtengo la cadena "[object Object]" como el valor de la tecla de página en lugar de un objeto json muy bien analizado.
¿Dónde debería buscar: JQuery o Rails?
EDITAR:
He resuelto mi problema de stringifying el objeto json con un script que se encuentra aquí: 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 );
}
});
En el lado de los rieles se debe requerir la gema Json. En el controlador:
params[:page] = JSON.parse params[:page] if params[:page].is_a? String
PUT y DELETE no son compatibles con todos los navegadores, RubyOnRails admite pasar un parámetro adicional con sus datos llamado _method que indicará cómo RoR tratará la solicitud.
$.ajax({
type: "POST",
url: ''/admin/pages/1.json'',
data: { _method:''PUT'', page : {...} },
dataType: ''json'',
success: function(msg) {
alert( "Data Saved: " + msg );
}
});
Probablemente solo necesite establecer los encabezados de solicitud en jQuery.
jQuery.ajaxSetup({
''beforeSend'': function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript");
}
})
Tuve un problema similar [objeto Object] con jQuery / rails, pero con HTML, en lugar de JSON. Tal vez esto ayude -
param de [object Object]
data: { lesson: { date: drop_date } }
param de lesson[date]
data: { "lesson[date]": drop_date }
espero que esto ayude -
var id = $(''#route_id'').val()
$.ajax({
type: ''PUT'',
url: ''/routes/''+ id,
data: $(''#markerform'').serializeArray(),
dataType: "JSON",
success: function(data) {
console.log(data);
}
});