уровне стека слишком глубоко при размещении длинных вложенный список в AJAX-запрос



Я публикую длинный вложенный список, который выглядит следующим образом на firebug:



Длинный вложенный список http://i.imm.io/1m4s2.jpeg



Хотя вы можете видеть на том же изображении, что сообщение успешно, единственное, что появляется в журнале, - это следующие строки:




[2013-12-11 20:50:37] ERROR SystemStackError: stack level too deep
/home/fotanus/.rvm/gems/ruby-2.0.0-p247/gems/rack-1.5.2/lib/rack/utils.rb:527



И ни одно действие, кажется, не выполняется на рельсах.



Длинный список отправляется со следующей строкой:




$.ajax({ type: "POST", url: '/projects', data: JSON.stringify({ sortd_items: sorted_items }) })



Где sorted_items печатается на изображении, генерируемом рекурсивная функция.



Почему это происходит, и как я могу заставить вещи работать, как ожидалось?



Edit: использование меньшего списка, кажется, работает:




Started POST "/projects" for 127.0.0.1 at 2013-12-11 21:01:08 -0200
Processing by ProjectsController#create as */*
Parameters: {"{"sortd_items":"=>{""2","=>{""5","=>[{","6","=>[{","7","=>[{","8","=>[{","3","=>{""10","=>[{","10","=>[{","4","=>[{","5","=>[{","6","=>[{","7","=>[{","8","=>[{","3","=>{""10","=>[{","10","=>[{","4","=>[{","9","=>{""11","=>[{","12","=>{""13","=>[{","14","=>[{","15","=>[{","13","=>[{","14","=>[{","15","=>[{","11","=>[{","12","=>{""13","=>[{","14","=>[{","15","=>[{","13","=>[{","14","=>[{","15","=>[{"}"=>nil}]}]}]}]}]}]}}]}]}]}]}]}]}]}}]}}]}]}]}}]}]}]}]}]}]}]}}]}]}]}]}}}
Completed 400 Bad Request in 1ms



Но мне нужно заставить его работать и с большими списками.
457   2  

2 ответов:

Стеллаж utils.метод РБ to_params_hash действительно рекурсия. Он делает это, потому что, per http://api.jquery.com/jQuery.ajax/ , $.ajax() обрабатывает переменную data: как строку, содержащую параметры запроса URL.

Вместе взятые, Rails обрабатывает каждый ключ в вашей вложенной структуре как то, что вы хотите видеть в вашем хэше params. Вам просто нужно передать весь этот JSON в виде строки, чтобы ваши собственные методы могли безопасно декодировать его как JSON, используя библиотеку C JSON, которая (вероятно) не будет злоупотреблять стек.

Per jQuery ajax data two variables , вы можете вставить строку в хэш и передать хэш:

var dataObj = {};
dataObj[json]=JSON.stringify({ sortd_items: sorted_items });
$.ajax({ ... data: dataObj });

​ Теперь $.ajax() не будет видеть строку, не будет преобразовывать ее в параметры запроса и не будет перебирать стойку.

Я думаю, что это вопрос правильной установки заголовков в запросе ajax должным образом. Вы можете публиковать данные, которые были пропущены через JSON.stringify, но сервер не будет знать, что с ними делать, если вы не скажете ему, что он получает. Это должно исправить его:

$.ajax({
  type: 'POST',
  url: '/projects',
  contentType: 'json',
  data: JSON.stringify({ sortd_items: sorted_items })
})

Comments

    Ничего не найдено.