我一直试图让我的前端向我的数据库发送带有一组数据的JSON对象。使用Postgres,有一个特殊的迁移将JSON作为' payload':
处理app.json
使用class CreateTournois < ActiveRecord::Migration[5.1]
def change
create_table :tournois do |t|
t.json 'payload'
t.timestamps
end
end
end
,我将JSON提交给模型:
xmlhttp
我使用基本表格标签:
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 %>
我的JSON对象的内容被插入到模型中,更改被保存到数据中,但即使进行了更改,我也会被重定向到错误页面。
我在第8行 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
:
TypeError没有将nil隐式转换为String
如何获得控制器接受的参数? 我不知道它是否相关但我在这里使用GoJs Library就是myDiagram初始化的行:
@tournoi = Tournoi.new(payload: JSON.parse(params['payload']))
答案 0 :(得分:1)
如果这有帮助,我通过使用 .to_json
解决了类似的问题
JSON.parse(params.to_json)
答案 1 :(得分:0)
params['payload']
是nil
。 JSON.parse(...)
如果传递nil
值,则会抛出此错误。
您可以使用以下内容来确保有效负载存在(如果没有有效负载可以接受):
if @tournoi.nil? && params['payload']
@tournoi = Tournoi.new(payload: JSON.parse(params['payload']))
...
否则,将修复Javascript,因为它当前没有传递有效负载。也许添加定义myDiagram
的位置,您可以根据需要获得更多帮助:)
如果您有任何问题,请告诉我。
答案 2 :(得分:0)
使用@tournoi = Tournoi.new(payload: JSON.parse(params[:payload]))
时总会出现错误,只需修改方法create <,就会在 JSON.parse(params [:payload])上专门引发TypeError / strong>:
def create
if @tournoi = Tournoi.new(payload: params['payload'])
@tournoi.save
.......
不解析params将保存有效负载,但它将保存另一个有效载荷为nil的tournoi,我需要做的是在我的模型中添加验证以避免保存nil有效负载的tournoi:
class Tournoi < ApplicationRecord
validates :payload, presence: true, allow_nil: false
当提交到tournoi模型时,插入并提交有效负载,因为有效负载是nill
,所以第二个tournoi上的数据库回滚