Domanda un po 'vecchia, ma oggi ho combattuto con questo, ed ecco la risposta che ho trovato: credo che questo sia leggermente colpa di jQuery, ma che stia solo facendo ciò che è naturale per esso. Tuttavia, ho una soluzione alternativa.
Data la seguente chiamata jQuery ajax:
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
data : {"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}]}
});
I valori che jQuery pubblicherà saranno simili a questo (se guardi la richiesta nel tuo Firebug-of-choice) ti daranno dati del modulo che assomigliano a:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Se usi CGI.unencode che otterrai
shared_items[0][entity_id]:1
shared_items[0][position]:1
Credo che ciò sia dovuto al fatto che jQuery pensa che quelle chiavi nel tuo JSON siano nomi di elementi del modulo e che dovrebbe trattarle come se avessi un campo denominato "utente [nome]".
Quindi entrano nella tua app Rails, Rails vede le parentesi e costruisce un hash per contenere la chiave più interna del nome del campo (l '"1" che jQuery ha "utilmente" aggiunto).
Ad ogni modo, ho aggirato questo comportamento costruendo la mia chiamata ajax nel modo seguente;
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
data : {"data": JSON.stringify({"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}])},
}
});
Il che costringe jQuery a pensare che questo JSON sia un valore che vuoi passare, interamente, e non un oggetto Javascript che deve prendere e trasformare tutte le chiavi in nomi di campo del modulo.
Tuttavia, ciò significa che le cose sono un po 'diverse sul lato di Rails, perché è necessario decodificare esplicitamente il JSON in params [: data].
Ma va bene:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: Quindi, la soluzione è: nel parametro data alla tua chiamata jQuery.ajax (), fallo {"data": JSON.stringify(my_object) }
esplicitamente, invece di alimentare l'array JSON in jQuery (dove indovina erroneamente cosa vuoi fare con esso.