2013-12-11 1 views
2

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

long nested list 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

И никакого действия не кажется, будет выполняться на Rails.

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

$.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

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

+0

Как именно вы публикуете эти данные? Похоже, что может произойти то, что вы отправляете объект, который не является особенно глубоким (возможно, около глубины 5, максимум), но он будет частью Rack, который пытается разобрать его в другом формате, который в конечном итоге создает очень глубокий хэш вместо того, что он намеревается сделать. А именно, я думаю, вы можете отправить сервер неправильно закодированной строке запроса. – Bubbles

+0

@Bubbles 'Как именно вы отправляете эти данные?' Я скопировал строку из моего javascript-файла, который отправляет данные, - если вам нужно что-то другое, извините, я не понял. Как именно я проверяю, правильно ли закодирована строка? 'JSON.stringfy' не уверяет? – fotanus

ответ

1

The Rack utils.rb метод to_params_hash действительно рекурсивно. Он делает это, потому что в отношении 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() не увидит строку, не превратить его в параметры запроса, и не будет срывать стойку.

+0

Спасибо, я буду тестировать это сегодня вечером и дам вам знать. – fotanus

+0

Будет награждать вас дополнительными 100 очками завтра, когда stackoverflow позволит мне. – fotanus

1

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

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