【发布时间】:2018-04-27 15:19:33
【问题描述】:
我一直在尝试让我的前端将带有一组数据的 JSON 对象发送到我的数据库。使用 Postgres,有一个特殊的迁移将 JSON 作为“有效负载”处理:
class CreateTournois < ActiveRecord::Migration[5.1]
def change
create_table :tournois do |t|
t.json 'payload'
t.timestamps
end
end
end
使用xmlhttp,我将我的 JSON 提交给模型:
function save() {
var tojs = myDiagram.model.toJSON();
var json = JSON.stringify(tojs);
var formData = new FormData();
formData.append('payload', json);
var request = new XMLHttpRequest();
request.open("post", "http://localhost:3000/malesingle", "application/json", true);
request.send(formData);
}
我使用了一个基本的表单标签:
<%= form_for Tournoi.new do |f| %>
<button id="SaveButton" onclick="save()">Save</button>
<% end %>
我的控制器似乎有一些问题:
def create
if @tournoi.nil?
@tournoi = Tournoi.new(payload: JSON.parse(params['payload']))
@tournoi.save
redirect_to malesingle_url
else
redirect_to root_url
end
end
我的 JSON 对象的内容被插入到模型中,并且更改被保存到数据中,但是即使进行了更改,我也会被重定向到错误页面。
我在第 8 行 @tournoi = Tournoi.new(payload: JSON.parse(params['payload'])) 收到此错误:
TypeError 没有将 nil 隐式转换为 String
如何让我的控制器接受参数? 我不知道它是否相关,但我正在为此使用 GoJs 库,这里是 myDiagram 初始化的行:
var $ = go.GraphObject.make;
myDiagram =
$(go.Diagram, "myDiagramDiv", {
initialContentAlignment: go.Spot.Center, // center the content
"textEditingTool.starting": go.TextEditingTool.SingleClick,
"textEditingTool.textValidation": isValidScore,
layout: $(go.TreeLayout, { angle: 180 }),
"undoManager.isEnabled": true
});
// validation function for editing text
function isValidScore(textblock, oldstr, newstr) {
if (newstr === "") return true;
var num = parseInt(newstr, 10);
return !isNaN(num) && num >= 0 && num <= 1;
}
【问题讨论】:
-
你有没有尝试过打破它? ``` payload = JSON.parse(params['payload']) @tournoi = Tournoi.new(payload: payload) ``` 或者检查
params['payload']以确保它得到正确的数据?我的猜测是解析 JSON 是导致问题的原因,并且在它不喜欢的地方有一些nil值。甚至可能是params['payload']。也许类似的问题:stackoverflow.com/questions/40038922/…
标签: ruby-on-rails json post parameters controller