首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在rails-ujs Rails.ajax POST调用(不使用jQuery)中发送JSON数据?

如何在rails-ujs Rails.ajax POST调用(不使用jQuery)中发送JSON数据?
EN

Stack Overflow用户
提问于 2017-08-22 14:35:51
回答 6查看 5.9K关注 0票数 23

我有一个React客户端应用程序,需要与Rails API对话。我想使用rails-ujs方法Rails.ajax。例如:

代码语言:javascript
复制
Rails.ajax({
  type: "POST", 
  url: "/things",
  data: mydata,
  success: function(response) {...},
  error: function(response) {...}
})

看起来,我无法将data设置为这样的JSON对象:

代码语言:javascript
复制
mydata = {
 thing: {
  field1: value1,
  field2: value2,
}}

我需要手动将其转换为application/x-www-form-urlencoded内容类型,如下所示:

代码语言:javascript
复制
mydata = 'thing[field1]=value1&thing[field2]=value2'

对于平面数据来说,这是可以的,但是对于嵌套数据来说,这很快就变得复杂了。

jQuery在发出请求之前自动进行转换。

所以我想知道,Rails UJS是否有某种自动的方法,,但是我在文档或代码中找不到任何东西。

EN

回答 6

Stack Overflow用户

发布于 2019-12-15 00:55:22

使用Rails UJS时,必须将数据格式化为字符串窗体参数。不幸的是,它不可能提供JSON,至少目前没有Rails 6.0.2 (不理想)。

解决方案

使用URLSearchParams将JSON转换为URL参数:

代码语言:javascript
复制
myData = {
 thing: {
  field1: value1,
  field2: value2,
}}

Rails.ajax({
  type: "POST",
  url: "/things",
  data: new URLSearchParams(myData).toString()
})
票数 16
EN

Stack Overflow用户

发布于 2019-11-20 19:27:29

下面是我使用内容-Type: application/json发布/发布的解决方法。

它通过在options.data回调中设置beforeSend来工作。这样,内部Rails.ajax.createXHR方法就不会首先设置Content标头。https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/utils/ajax.coffee#L53

代码语言:javascript
复制
    Rails.ajax({
      url: 'http://some-url.com',
      type: 'put',
      beforeSend(xhr, options) {
        xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8')
        // Workaround: add options.data late to avoid Content-Type header to already being set in stone
        // https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/utils/ajax.coffee#L53
        options.data = JSON.stringify(data)
        return true
      },
    });
票数 8
EN

Stack Overflow用户

发布于 2017-08-22 14:53:57

我多次使用ajax调用,并且经常像这样发送json数据。

代码语言:javascript
复制
var fd = new FormData();
fd.append("jsondata", JSON.stringify(mydata));

$.ajax({
  url: ...
  type :"post",
  data: fd
  success:function(){
  }
})

在ruby控制器中解析Json数据很容易。您可以只使用JSON.parse(params["jsondata"])

希望这对你的案子有用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45820587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档