2012-11-22 38 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