Передача postData FormData в контроллер Rails - PullRequest
0 голосов
/ 27 апреля 2018

Я пытался заставить мой интерфейс отправить объект 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;
  }

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Ошибка всегда возникает при использовании @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
.......

Не анализируя параметры, вы сохраните полезную нагрузку, но сохраните еще один турне с нулевой полезной нагрузкой, все, что мне нужно сделать, это добавить проверку в моей модели, чтобы избежать турне с нулевой полезной нагрузкой, которую необходимо сохранить:

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

При отправке в модель tournoi полезная нагрузка вставляется и фиксируется, откат БД для второй tournoi, поскольку полезная нагрузка равна нулю

0 голосов
/ 27 апреля 2018

params['payload'] - это nil. JSON.parse(...) выдает эту ошибку, если ей передано значение nil.

Вы можете использовать следующее, чтобы убедиться, что полезная нагрузка существует (если допустимо, чтобы полезной нагрузки не было):

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

В противном случае это будет случай исправления Javascript, поскольку в настоящее время он не передает полезную нагрузку, как это должно быть. Возможно, добавьте, где определен myDiagram, и вы сможете получить немного больше помощи по этому вопросу:)

Дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...