2014-08-30 12 views
8

Indipendentemente da come formattare la parte non elaborata di questa richiesta, non è possibile evitare l'errore di analisi riportato di seguito.Come creare la richiesta del postino per il metodo Rails POST

Ho un API Rails con un metodo create che passa le specifiche, per illustrare che il messaggio di controllo è il suono:

describe "POST power_up" do 

    let!(:client) { FactoryGirl.create :client, name: "joe", auth_token: "asdfasdfasdfasdfasdfasdf" } 

    it "should create and save a new Power Up" do 

     expect { post :create, format: :json, power_up: FactoryGirl.attributes_for(:power_up) }.to change(V1::PowerUp, :count).by(1) 
    end 

    end 

sto usando Postman per cercare di POST ad esso. Non importa quello che provo sto ottenendo l'errore:

Started POST "/v1/power_ups.json" for 127.0.0.1 at 2014-08-30 18:05:29 -0400 
Error occurred while parsing request parameters. 
Contents: 

{ 
    'name': 'foo', 
    'description': 'bar' 
} 


ActionDispatch::ParamsParser::ParseError (795: unexpected token at '{ 
    'name': 'foo', 
    'description': 'bar' 
} 

Postman richiesta di impostazione:

screen cap of postman request

Ho anche provato:

{ 
    'power_up': { 
    'name': 'foo', 
    'description': 'bar' 
    } 
} 

Codice da creare metodo e dichiarazione dei parametri forti in power_ups_controller.rb:

def create 
    @power_up = PowerUp.new(power_up_params) 

    if @power_up.save! 
    redirect_to @power_up 
    end 
end 

private 

    def power_up_params 
    params.require(:power_up).permit(:name, :description) 
    end 

risposta

5

Le virgolette singole (') non sono in realtà il valore legale string delimiter in JSON: una stringa deve essere racchiusa tra virgolette doppie ("). Puoi farla franca nel browser, dato che sono delimitatori di stringhe in javascript. Si può facilmente replicare questo in una sessione IRB

JSON.parse(%q[{'foo': 'bar'}]) #=> raises JSON::ParserError 
JSON.parse(%q[{"foo": "bar"}]) #=> ok 

Inoltre, dato il tuo spec si dovrebbe utilizzare la seconda forma cioè

{ 
    "power_up": { 
    "name": "foo", 
    "description": "bar" 
    } 
} 
+0

Mi hai spostato più vicino appare. Tuttavia ottengo il seguente: 'ActionController :: ParameterMissing (param mancante o il valore è vuoto: power_up):'. Ho anche provato a rimuovere le parentesi graffe che racchiudono. –

+0

Ciò significa che i dati non corrispondono ai forti requisiti dei parametri impostati dal controller. –

+0

Ho aggiunto i parametri forti e ho creato i metodi sopra. C'è una stranezza, che 'PowerUp' è all'interno di un modulo' V1'. –

9

po 'dispiaciuto troppo tardi per rispondere a questo, ma potrebbe aiutare qualcun altro.

Tutto quello che dovete fare è - nell'intestazione richiesta (in postino o qualunque client) aggiungere

Content-Type = 'application/json'

In alternativa, si può anche provare con l'arricciatura (fonte):

curl -X POST -H "Content-Type: application/json" -d '{"power_up": { "name": "foo", "description": "bar" } }' 127.0.01:3000/v1/power_ups.json

+0

Mi dimentico sempre di aggiungere il 'Content-Type: application/json' quando si usa raw-json body Se non impostato, i miei parametri non sono presenti (nel controller Rails) Grazie per la risposta, questo mi dà molto! – mattLummus

6

Come @Tejas Patel ha detto che si tratta di intestazioni. Ma invece di impostare in modo esplicito si può solo:

  1. nello switch richiesta Superficie creazione alla scheda body. Impostare il pulsante radio raw. In l'ingresso nell'area di testo in basso il corpo:

    { "power_up": { "name": "foo", "description": "bar" } }

  2. Poi, in un elenco a discesa per il rigth scegliere JSON (application/json) opzione invece del Text opzione predefinita. Ciò imposterà automaticamente le intestazioni richieste. È così: puoi premere il pulsante "Invia".

Problemi correlati