【问题标题】:Passing post request formData to Rails controller将 post 请求 formData 传递给 Rails 控制器
【发布时间】: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


【解决方案1】:

如果这有任何帮助,我可以像这样使用.to_json 解决了类似的问题

JSON.parse(params.to_json)

【讨论】:

  • 问题已经修复很久了,谢谢你的回答。
【解决方案2】:

params['payload']nilJSON.parse(...) 如果传递了 nil 值,则会引发此错误。

您可以使用以下方法来确保有效负载存在(如果没有有效负载是可以接受的):

if @tournoi.nil? && params['payload']
  @tournoi = Tournoi.new(payload: JSON.parse(params['payload']))
  ...

否则,这将是修复 Javascript 的情况,因为它当前没有按应有的方式传递有效负载。也许添加 myDiagram 的定义位置,您将能够根据需要获得更多帮助:)

如果您有任何问题,请告诉我。

【讨论】:

  • 使用@tournoi.nil? &amp;&amp; params['payload'] 让我在“有效负载”上得到一个 noMethodError,是的,我将添加我的图表的定义位置
【解决方案3】:

使用@tournoi = Tournoi.new(payload: JSON.parse(params[:payload])) 时总是会引发错误,TypeError 是专门在 JSON.parse(params[:payload]) 上引发的,只需修改 方法 create :

def create
      if @tournoi = Tournoi.new(payload: params['payload'])
          @tournoi.save
.......

不解析参数将保存有效负载,但它将保存另一个具有有效负载 nil 的 tournoi,我需要做的就是在我的模型中添加一个验证以避免要保存具有 nil 有效负载的 tournoi:

class Tournoi < ApplicationRecord
  validates :payload, presence: true, allow_nil: false

当提交到 tournoi 模型时,payload 被插入并提交,第二个 tournoi 上的数据库回滚,因为 payload 为 nill

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2011-12-28
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多