Trochę stare pytanie, ale dzisiaj sam z tym walczyłem, a oto odpowiedź, na którą wpadłem: uważam, że to trochę wina jQuery, ale robi to tylko to, co jest dla niego naturalne. Mam jednak obejście.
Biorąc pod uwagę następujące wywołanie jQuery ajax:
$.ajax({
type : "POST",
url : 'http:
dataType: 'json',
data : {"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}]}
});
Wartości, które opublikuje jQuery, będą wyglądać mniej więcej tak (jeśli spojrzysz na żądanie w swoim Firebug-of-choice), dadzą ci dane formularza, które wyglądają następująco:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Jeśli masz CGI.uncode, który otrzymasz
shared_items[0][entity_id]:1
shared_items[0][position]:1
Wydaje mi się, że dzieje się tak, ponieważ jQuery uważa, że te klucze w twoim JSON są nazwami elementów formularza i że powinno traktować je tak, jakbyś miał pole o nazwie „user [nazwa]”.
Więc przychodzą do twojej aplikacji Railsów, Railsy widzą nawiasy i konstruują hash do przechowywania najbardziej wewnętrznego klucza nazwy pola („1”, które jQuery „pomocnie” dodało).
W każdym razie obejrzałem to zachowanie, konstruując moje wywołanie ajax w następujący sposób;
$.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}])},
}
});
Co zmusza jQuery do myślenia, że ten kod JSON jest wartością , którą chcesz przekazać w całości, a nie obiektem JavaScript, który musi przyjąć i zamienić wszystkie klucze w nazwy pól formularza.
Jednak oznacza to, że po stronie Railsów sprawy wyglądają trochę inaczej, ponieważ musisz jawnie zdekodować JSON w params [: data].
Ale jest dobrze:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: Więc rozwiązanie jest takie: w parametrze data w wywołaniu jQuery.ajax () rób to {"data": JSON.stringify(my_object) }
jawnie, zamiast podawać tablicę JSON do jQuery (gdzie błędnie zgadnie, co chcesz z nią zrobić.