【问题标题】:Passing json object to model as payload将 json 对象作为有效负载传递给模型
【发布时间】:2018-04-18 16:55:12
【问题描述】:

我的 Rails 应用程序出现问题。 我让用户在完成编辑后提交并填写括号。 :

 <%= form_for Tournoi.new do |f| %>
  <button id="SaveButton" onclick="save()">Save</button>
<% end %>

使用 XMLHttpRequest 我将 json 对象发送到我的数据库:

function save() {
    var data = {};
    var tojs = myDiagram.model.toJSON();
    data.payload = tojs;
    //var parsed_json = JSON.parse(data);
    var json = JSON.stringify(data);
    myDiagram.isModified = false;

    var request = new XMLHttpRequest();
    request.onload = callback;
    request.open("post", "http://localhost:3000/malesingle", true);
    request.setRequestHeader("Content-Type", "application/json");
    request.send(json)

我的迁移设置为接受 json 对象作为有效负载:

class CreateTournois < ActiveRecord::Migration[5.1]
  def change
    create_table :tournois do |t|
      t.json 'payload'
      t.timestamps
    end
  end
end

我的 tournois 控制器是我认为我遇到一些困难的地方:

def create
     @tournoi = Tournoi.new params[:payload]
        if @tournoi.save
      redirect_to root_url
        flash[:success] = "Your tournament bracket has been validated!"
        redirect_to @tournoi
      else
        redirect_to malesingle_url
      end
  end

这是每次我尝试提交括号时的问题,我的 json 对象 stringify 的内容出现在我的终端上,POST 参数似乎通过了,我的有效负载参数变成了我的 json 对象的内容,但出于某种原因我得到一个参数错误(分配属性时,您必须传递一个哈希作为参数。)这使我的迁移回滚。

我知道错误来自我的控制器,但我似乎无法找到我出错的地方,或者是否缺少某些东西或顺序错误。

【问题讨论】:

  • 在 Rails 应用程序中看到的 params[:payload] 是一个常规字符串。在将其传递给new 方法之前,您需要将其解析为 json:Tournoi.new(JSON.parse(params[:payload])
  • 另外,我认为您需要在模型中指定字段:Tournoi.new(payload: JSON.parse(params[:payload])
  • @mikwat def create @tournoi = Tournoi.new(payload: JSON.parse(params[:payload])),仍然让我出错,从 ArgumentError 到 TypeError 没有将 nil 隐式转换为字符串

标签: javascript ruby-on-rails xmlhttprequest ruby-on-rails-5


【解决方案1】:

由于您的 Rails 端点需要表单数据,因此请像这样发送您的 JSON:

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", true);
request.send(formData);

然后,假设您使用的 Postgres 支持 JSON 类型的字段,“有效负载”参数需要解析为哈希,并且需要指定字段名称:

Tournoi.new(payload: JSON.parse(params[:payload]))

【讨论】:

  • 我的 /malesingle 路径的 post 方法通过,现在开始迁移
  • 我试过 raise params.inspect ,检查问题,唯一允许的是:false
  • @DezzH 我已经更新了我的答案以包含一些 javascript 更改。让我知道这是否有效。
  • 将表单数据添加到我的脚本中并没有对问题进行排序,我仍然在创建第 8 行(Tournoi.new(payload: JSON.parse(params[:payload])) )中得到一个 TypeError(没有将 nil 隐式转换为字符串)。我的 json 对象已保存到我的数据库中,但 TypeErro 仍然出现
  • 我认为由于某种原因params[:payload] 必须仍然是nil...你能通过puts params[:payload] 验证吗?
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多