Légèrement vieille question, mais je me suis battu avec moi-même aujourd'hui, et voici la réponse que j'ai trouvé: je crois que c'est un peu de jQuery faute, mais qu'il ne fait que ce qui est naturel. Je ne, cependant, ont une solution de contournement.
Compte tenu de la suite de jQuery ajax composez le:
$.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}]}
});
Les valeurs jQuery publierons va ressembler à quelque chose comme ceci (si vous regardez à la Demande dans votre Firebug de choix) vous donnera les données de formulaire qui ressemble à ceci:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Si vous CGI.unencode que vous obtiendrez
shared_items[0][entity_id]:1
shared_items[0][position]:1
Je crois que c'est parce que jQuery pense que ces clés dans votre JSON sont de forme des noms d'éléments, et qu'il doit les traiter comme si vous aviez un champ nommé "user[nom]".
Donc, ils viennent dans votre application Rails, Rails voit les crochets, et construit une table de hachage pour tenir le plus profond de la clé du nom du champ (le "1" jQuery "utilement", a ajouté).
De toute façon, j'ai eu autour de ce problème par la construction de mon appel ajax de la manière suivante;
$.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}])},
}
});
Qui des forces de jQuery à penser que cette JSON est une valeur que vous souhaitez passer, tout à fait, et pas un objet Javascript doit tenir et tourner toutes les clés dans les noms de champ de formulaire.
Toutefois, cela signifie que les choses sont un peu différentes sur les Rails de côté, parce que vous devez explicitement décoder le JSON dans params[:données].
Mais c'est OK:
ActiveSupport::JSON.decode( params[:data] )
TL;DR: Donc, la solution est la suivante: dans le paramètre data de votre jQuery.ajax() de l'appel, effectuez l' {"data": JSON.stringify(my_object) }
explicitement, au lieu de nourrir le tableau JSON en jQuery (où l'on devine, à tort, ce que vous voulez faire avec elle.