技术问询: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-corsgem,然后在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
相关产品推荐
相关产品推荐

