2012-11-22 34 views
3

我試圖通過$.ajax向Rails 3後端發送AJAX請求,並且我堅持一個奇怪的行爲。以下面的請求爲例:在AJAX請求中傳遞null Rails將其解釋爲「null」

$.ajax({ 
    url: $(this).attr('href'), 
    type: 'PUT', 
    dataType: "json", 
    data: {a: null}, 
    success: function (data) { 
     console.log("success!") 
    } 
}); 

我綁定到一個單擊事件。簡單。發生什麼事情是Rack解析URI編碼的表單參數爲{"a" => "null"},我真的想要解析爲{"a" => nil}。是否有任何非黑客的方式來實現這種行爲?

非常感謝!

P.S.如果我通過{a: undefined}那麼參數散列沒有a鍵。

+0

也許你可以設置'數據:{一個: ''}' –

+0

都能跟得上此通過'{ 「一個」=> 「」}' – Gerry

+0

當'{ 「一個」=> 「」}'傳遞ISN它在Rails的''params'中改爲null,或者鍵完全失蹤? – 244an

回答

5

好吧,我找到了解決方案。我必須將$.ajax呼叫更改爲:

$.ajax({ 
    url: $(this).attr('href'), 
    type: 'PUT', 
    dataType: "json", 
    contentType: "application/json", 
    data: JSON.stringify({a: null}), 
    processData: false, 
    success: function (msg) { 
     console.log("success!") 
    } 
}); 

它有兩個重要的事情。首先它將內容類型頭傳遞給JSON,以便請求有效載荷自動被Rack解析爲JSON。另一種是processData必須爲了阻止默認jQuery的行爲被設置爲false:

默認情況下,該數據選項傳遞作爲一個對象的數據(從技術上講,任何字符串以外的)會處理並轉換爲查詢字符串,以適應默認的內容類型「application/x-www-form-urlencoded」。

+0

只需要contentType和JSON.stringify,因爲在手動字符串化之後數據已經是字符串了。 http://api.jquery.com/jQuery.ajax/ – Dingle

+0

所以如果我需要上傳文件我的內容類型設置爲「false」,我的數據是一個formData對象...所以我怎麼能發送空在這種情況下的值? – danielgatis