уровне стека слишком глубоко при размещении длинных вложенный список в 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
Но мне нужно заставить его работать и с большими списками.
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