Rails / Coffeescript, свойство данных в массиве не передается

0

Имейте следующий запрос 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}
 }}

Как видите, массив преобразуется в хэш с инкрементными ключами. Почему данные не принимаются, когда я отправил их?

Теги:
coffeescript

1 ответ

1
Лучший ответ

Согласно документам 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}
}
  • 0
    Конечная точка доступна несколькими способами, и я хотел иметь стандартизированный формат. Таким образом я пытаюсь заставить массив пройти правильно.
  • 0
    Понятный. Это переполнение стека объясняет вторую ссылку в моем ответе. Дайте мне знать, если установка traditional = true работает.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню