Имейте следующий запрос Ajax:
data = {foo: {id: 1},
array: [
{id: 2, date: "Jan 1, 2015", quantity: 100}
]}
$.ajax "/api/foo",
type: "POST",
dataType: "JSON"
data: data,
success: (data) ->
console.log(data)
Проблема в том, что сервер получает следующие параметры:
{foo: {id: 1},
array: {
0:{id: 2, date: "Jan 1, 2015", quantity: 100}
}}
Как видите, массив преобразуется в хэш с инкрементными ключами. Почему данные не принимаются, когда я отправил их?
Согласно документам AJAX, это ожидаемое поведение.
данные
Тип: PlainObject или String или Array
Данные, которые необходимо отправить на сервер. Он преобразуется в строку запроса, если не является уже строкой. Он добавлен к URL-адресу для запросов GET. См. Параметр processData для предотвращения этой автоматической обработки. Объектом должны быть пары "ключ/значение". Если значением является массив, jQuery сериализует несколько значений с одним и тем же ключом на основе значения традиционной настройки (описано ниже).
Вы можете играть с traditional
настройкой, упомянутой в документах, чтобы попытаться получить то же самое представление, хотя вы должны иметь возможность использовать это как есть.
В вашем контроллере вы должны иметь возможность выполнять следующие params[:array][0]
или params[:array].each...
для доступа к данным. Вы все еще получаете ответ, который Ruby может обрабатывать как массив. Если бы в этом массиве было больше записей, это выглядело бы так.
array: {
0:{id: 2, date: "Jan 1, 2015", quantity: 100}
1:{id: 3, date: "Jan 1, 2015", quantity: 200}
2:{id: 4, date: "Jan 1, 2015", quantity: 300}
}
traditional = true
работает.