2017-08-22 40 views
6

Mam aplikację klienta React, która musi rozmawiać z interfejsem Rails API. Chcę użyć metody Rails.ajax z rails-ujs. Na przykład:W jaki sposób wysyłasz dane JSON do wywołania POST Rails.ajax Rails-ujs (nie używając jQuery)?

Rails.ajax({ 
    type: "POST", 
    url: "/things", 
    data: mydata, 
    success: function(repsonse){...}, 
    error: function(repsonse){...} 
}) 

Wygląda na to, że nie można ustawić data do obiektu JSON jak poniżej:

mydata = { 
thing: { 
    field1: value1, 
    field2: value2, 
}} 

Trzeba przekonwertować go do application/x-www-form-urlencoded treści wpisać ręcznie tak:

mydata = 'thing[field1]=value1&thing[field2]=value2' 

Jest to możliwe w przypadku danych płaskich, ale szybko się komplikuje w przypadku zagnieżdżonych danych.

jQuery wykonuje konwersję automatycznie przed wysłaniem żądania.

Więc zastanawiam się, , czy Rails UJS ma jakiś automatyczny sposób robienia tego, ale nie mogłem znaleźć niczego w dokumentach lub kodzie.

Odpowiedz

1

Użyłem kilka razy wywołania ajax i użyłem do wysyłania danych json w ten sposób.

var fd = new FormData(); 
fd.append("jsondata", JSON.stringify(mydata)); 

$.ajax({ 
    url: ... 
    type :"post", 
    data: fd 
    success:function(){ 
    } 
}) 

Parsowanie danych Json w kontrolerze ruby ​​jest łatwe. możesz po prostu użyć JSON.parse(params["jsondata"])
Mam nadzieję, że działa to w twoim przypadku.

+0

to nie całkiem to, czego szukam. Ale dziękuję za odpowiedź. –

1

Sprawdziłem kod biblioteki i nie obsługuje tego, ponieważ w celu wysłania obiektu musisz do stringify obiektu, a po wykonaniu tego odkryłem, że biblioteka sprawdza, czy dane jest typem ciągu To zmienia typ treści zapytania do aplikacji application/x-www-form-urlencoded. Ten link pokazuje ten stan w bibliotece. I do tego, twoją opcją do przezwyciężenia tego problemu jest napisanie metody, która przekształca obiekt na formę wejściową lub używa Ajax JQuery lub innej biblioteki.

+0

Tak, masz rację, Ahmed. To także fragment kodu, na który też patrzyłem. Zastanawiałem się tylko, czy istnieje inne miejsce, w którym przetwarza dane na wypadek, gdybym je przegapił. Dzięki za odpowiedź. –

0

Nie jestem pewien, czy nie rozumiem problemu, ale czy nie możesz po prostu przekształcić obiektu za pomocą JSON.stringify?

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

pewno widzę w szynach-ujs moduł go używa JSON.parse analizować odpowiedzi JSON

+0

Masz rację, sama mogę to przekonwertować. Moje pytanie brzmi: czy istnieje wbudowany sposób w szynach-ujs (jak w jQuery, patrz [processData] (http://api.jquery.com/jquery.ajax/)). Poza tym mówię o JSON w danych żądania, a nie o odpowiedzi. –

+0

Nie sądzę, że tak, ale nie wiem, dlaczego to jest ogromna transakcja? Jest dość nisko nad głową do JSON.stringify. Czy nie rozumiem, co próbujesz zrobić? –