2013-12-11 77 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

,沒有行動似乎on Rails的執行。

長列表正在使用以下行發送:

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

sorted_items其中被打印的圖象中,通過遞歸函數生成的。

爲什麼會發生這種情況,以及如何使事情按預期工作?

編輯:使用較小的名單似乎工作:

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

Rack utils.rb方法to_params_hash的確確實遞歸。這是因爲根據http://api.jquery.com/jQuery.ajax/,$.ajax()data:變量視爲包含URL查詢參數的字符串。

放在一起,Rails會將您嵌套結構中的每個鍵視爲您希望在您的params散列中看到的內容。你沒有;你只需要將所有JSON作爲一個字符串傳遞,這樣你自己的方法就可以安全地將它解碼爲JSON,使用C JSON庫(可能不會濫用堆棧)。

jQuery ajax data two variables,你也許能串塞進一個散列並通過散列:

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

現在$.ajax()不會看到一個字符串,不會將其轉換成查詢參數,並不會破壞Rack。

+0

謝謝,我今晚會測試這個,並且會讓你知道 – fotanus

+0

明天當stackoverflow讓我給你額外的100分。 – fotanus

1

我認爲這是正確設置ajax請求中的標題的問題。您可以發佈已通過JSON.stringify發佈的數據,但服務器不知道如何處理它,除非您告訴它它是什麼。這應該解決它:

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