Eine etwas alte Frage, aber ich habe heute selbst damit gekämpft, und hier ist die Antwort, die ich gefunden habe: Ich glaube, das ist etwas jQuerys Schuld, aber es tut nur das, was für sie natürlich ist. Ich habe jedoch eine Problemumgehung.
Bei folgendem jQuery Ajax-Aufruf:
$.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}]}
});
Die Werte, die jQuery veröffentlicht, sehen ungefähr so aus (wenn Sie sich die Anfrage in Ihrem Firebug Ihrer Wahl ansehen) und geben Ihnen Formulardaten, die wie folgt aussehen:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Wenn Sie CGI.unencode, den Sie erhalten
shared_items[0][entity_id]:1
shared_items[0][position]:1
Ich glaube, das liegt daran, dass jQuery der Meinung ist, dass diese Schlüssel in Ihrem JSON Formularelementnamen sind und dass sie so behandelt werden sollten, als hätten Sie ein Feld mit dem Namen "user [name]".
Sie kommen also in Ihre Rails-App, Rails sieht die Klammern und erstellt einen Hash, der den innersten Schlüssel des Feldnamens enthält (die "1", die jQuery "hilfreich" hinzugefügt hat).
Wie auch immer, ich habe dieses Verhalten umgangen, indem ich meinen Ajax-Aufruf folgendermaßen konstruiert habe:
$.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}])},
}
});
Dies zwingt jQuery zu der Annahme, dass dieser JSON ein Wert ist , den Sie vollständig übergeben möchten, und kein Javascript-Objekt, das alle Schlüssel in Formularfeldnamen umwandeln muss.
Dies bedeutet jedoch, dass die Dinge auf der Rails-Seite etwas anders sind, da Sie den JSON explizit in params [: data] dekodieren müssen.
Aber das ist in Ordnung:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: Die Lösung lautet also: Führen Sie im Datenparameter Ihres jQuery.ajax () -Aufrufs {"data": JSON.stringify(my_object) }
explizit aus, anstatt das JSON-Array in jQuery einzuspeisen (wo es falsch errät, was Sie damit tun möchten.