将post request formData传递给Rails控制器

时间:2018-04-27 15:19:34

标签: ruby-on-rails json post parameters controller

我一直试图让我的前端向我的数据库发送带有一组数据的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']))

3 个答案:

答案 0 :(得分:1)

如果这有帮助,我通过使用 .to_json 解决了类似的问题

JSON.parse(params.to_json)

答案 1 :(得分:0)

params['payload']nilJSON.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上的数据库回滚