Немного старый вопрос, но я боролся с этим сам сегодня, и вот ответ, который я придумал: я считаю, что это слегка вина jQuery, но он делает только то, что естественно для него.У меня, однако, есть обходной путь.
Учитывая следующий ajax-вызов jQuery:
$.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}]}
});
Значения, которые будет публиковать jQuery, будут выглядеть примерно так (если вы посмотрите на Запрос в вашемFirebug-of-Choice) даст вам данные формы, которые выглядят следующим образом:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Если вы получите CGI.unencode, который вы получите
shared_items[0][entity_id]:1
shared_items[0][position]:1
Я полагаю, это потому, что JQuery думаетчто эти ключи в вашем JSON являются именами элементов формы, и что он должен обращаться с ними так, как если бы у вас было поле с именем «user [name]».
Таким образом, они входят в ваше приложение Rails, Rails видит скобки,и создает хеш для хранения самого внутреннего ключа имени поля («1», который jQuery «услужливо» добавил).
В любом случае, я справился с этим поведением, сконструировав свой вызов ajax следующим образом;
$.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}])},
}
});
Что заставляет jQuery думать, что этот JSON представляет собой значение , которое вы хотите передать целиком, а не объект Javascript, который он должен принять, и повернуть всеключи в имена полей формы.
However, это означает, что на стороне Rails все немного по-другому, потому что вам нужно явно декодировать JSON в params [: data].
Но это нормально:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: Итак, решение заключается в следующем: в параметре data для вашего вызова jQuery.ajax (), сделайте явно {"data": JSON.stringify(my_object) }
вместо подачи массива JSON в jQuery (где он ошибочно угадывает, что вы хотитеделать с этим.