【问题标题】:Passing null in AJAX request Rails interprets it as "null"在 AJAX 请求中传递 null Rails 将其解释为“null”
【发布时间】:2012-11-22 10:14:17
【问题描述】:

我正在尝试通过 $.ajax 向 Rails 3 后端发送 AJAX 请求,但我遇到了一个奇怪的行为。以如下请求为例:

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

我绑定到一个点击事件。简单的。发生的事情是 Rack 将 URI 编码的表单参数解析为{"a" => "null"},而我真的很想被解析为{"a" => nil}。是否有任何非骇客的方式来实现这种行为?

非常感谢!

附:如果我通过 {a: undefined} 则 params 哈希根本没有 a 键。

【问题讨论】:

  • 也许你可以设置data: {a: ''}
  • 不,这通过了{"a"=>""}
  • {"a"=>""} 被传递时,Rails 中的params 中是不是变成了nil,或者key 完全丢失了?

标签: jquery ruby-on-rails ajax ruby-on-rails-3


【解决方案1】:

好的,我找到了解决方案。我不得不将$.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必须设置为false,以防止默认的jQuery行为:

默认情况下,作为对象(从技术上讲,除了字符串之外的任何内容)传入 data 选项的数据将被处理并转换为查询字符串,适合默认的内容类型“application/x-www-form -urlencoded”。

【讨论】:

  • 只需要contentType和JSON.stringify,因为手动stringify后数据已经是字符串了。 api.jquery.com/jQuery.ajax
  • 所以如果我需要上传文件,我的内容类型设置为false,我的数据是formData object ...那么在这种情况下我如何发送空值?
猜你喜欢
  • 2018-05-04
  • 2021-08-13
  • 2016-03-31
  • 1970-01-01
  • 2018-06-17
  • 2020-12-09
  • 2021-11-02
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多