You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:Rails+PostgreSQL传JSON为payload及GoJS数据提交问题

2. 修复GoJS save函数提交FormData到Rails的问题

看了你给出的代码片段,应该是没写完发送请求的部分,还有可能存在参数结构不匹配Rails期望的问题,我来帮你修正并完善:

修正后的前端save函数

function save() {
  // 获取GoJS图的JSON数据
  var diagramModel = myDiagram.model.toJSON();
  // 转换成字符串(GoJS的toJSON返回JSON对象,所以需要stringify处理)
  var payloadString = JSON.stringify(diagramModel);

  var formData = new FormData();
  // 关键:Rails默认期望参数嵌套在模型名的键下,所以用`malesingle[payload]`
  formData.append("malesingle[payload]", payloadString);

  var request = new XMLHttpRequest();
  // 注意:RESTful路由规范里,创建资源的POST请求应该指向复数路径
  request.open("POST", "http://localhost:3000/malesingles", true);

  // 监听请求结果
  request.onload = function() {
    if (request.status >= 200 && request.status < 400) {
      var response = JSON.parse(request.responseText);
      alert("图表数据保存成功!");
      console.log("返回数据:", response);
    } else {
      console.error("保存失败,状态码:", request.status);
      alert("保存失败,请检查控制台日志");
    }
  };

  // 监听请求连接错误
  request.onerror = function() {
    console.error("请求连接出错,请检查Rails服务是否启动");
    alert("连接失败,请确认Rails服务运行正常");
  };

  // 发送请求(这一步你之前应该漏掉了)
  request.send(formData);
}

几个关键注意点:

  • 路由规范:Rails的RESTful路由里,创建资源的POST请求应该指向复数路径/malesingles,你可以通过rails routes命令确认路由是否正确。
  • 参数嵌套:Rails默认期望参数被包裹在模型名的键下(比如malesingle[payload]),这样控制器的strong parameters才能正确接收。如果不想嵌套,也可以直接传payload,但控制器里要改成params[:payload]来获取。
  • 跨域问题:如果你的前端页面和Rails服务不在同一个端口(比如前端在8080,Rails在3000),需要处理CORS。可以安装rack-cors gem,然后在config/initializers/cors.rb里配置:
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'http://localhost:8080' # 替换成你的前端实际端口
    resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

内容的提问来源于stack exchange,提问作者Dezz H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:29:38