2017-02-06 2 views
0

Ich baue eine Angular 2 Front-End-App, die Daten von einer Rails 5 API erhält. Es ist eine Art Netzwerkinventar App.Rails has_many Eingabe von Angular2 Frontend wird nicht gespeichert

Ich habe eine Asset-Form in Angular2 und es gibt einen Multi-Select-Eingang für die ip_addresses der Anlage.

Ich kann Rails nicht dazu bringen, diese Daten im Back-End zu akzeptieren.

Das Anlageobjekt:

{"name":"SERVER_A","serial":"XOR-354","location_id":1,"asset_type_id":1,"model_id":3,"ip_address_ids":[5304,5305]}

Hier ist meine asset.service.ts:

createAsset(asset: Asset){ 

let formData = new FormData(); 

for(var key in asset){ 
    if(key == "ip_address_ids") { 
    for (var i = 0; i < asset[key].length; i++) { 
     formData.append("asset["+key+"][]", JSON.stringify(asset[key][i])); 
     console.log("asset["+key+"][]", JSON.stringify(asset[key][i])); 
    } 

    } 
    if(key != "id") { 
    formData.append("asset["+key+"]", asset[key]); 
    } 
} 

let headers = new Headers(); 

let authToken = localStorage.getItem('auth_token'); 
headers.append('Authorization', authToken); 

return this.http.post(this.assetUrl, formData, { headers }) 
       .map((response: Response) => response.json());} 

Dies ist, was im in der Rails-Server-Konsole bekommen:

Started POST "/assets" for ::1 at 2017-02-06 13:58:33 +0100 


Processing by AssetsController#create as HTML 


Parameters: {"asset"=>{"name"=>"SERVER_A", "description"=>"undefined", 
"serial"=>"XOR-354", "asset_tag"=>"undefined", 
"firmware"=>"undefined", "ssh"=>"undefined", "telnet"=>"undefined", 
"http"=>"undefined", "location_id"=>"1", "asset_type_id"=>"1", 
"model_id"=>"3", "prtg_id"=>"undefined", "ticket_id"=>"undefined", 
"ip_address_ids"=>"5304,5305"}} 

Unpermitted parameter: ip_address_ids 

Ich habe den Parameter ip_address_ids

zugelassen

Die seltsame Sache ist, dass, wenn ich den erweiterten REST-Client in Chrome verwenden, es erfolgreich ist.

Here's an image of the REST Client

Das Ergebnis in der Rails-Server-Konsole:

Started POST "/assets" for ::1 at 2017-02-06 14:04:42 +0100 

Processing by AssetsController#create as HTML 

Parameters: {"asset"=>{"name"=>"Test", "asset_type_id"=>"2", "location_id"=>"33", "model_id"=>"4", "ip_address_ids"=>["5213", "5214"]}} 

Ich denke, dass das Problem ist, dass Angular die IDs als String sendet und das REST-Client sendet die IDs als Array von Strings .

Haben Sie eine Idee, wie Sie das beheben können?

+0

Versuchen Sie 'accept_nested_attributes' auf Ihrem Modell (Backend) zu setzen und ändern Sie ALLE Ereignisse (Front und Backend) von' ip_address_ids' in 'ip_address_ids_atrributes'. – developer033

+0

Ist das nicht nur, wenn ich eine neue IP-Adresse erstellen möchte? Die IPs sind bereits in der Datenbank vorhanden. – Betax

+0

Sind Sie sicher, dass es bereits existiert? Wie Sie bereits erwähnt haben, können Sie den Parameter nicht übergeben. 'Unerreichter Parameter: ip_address_ids'. – developer033

Antwort

0

Ihre ip_address_ids Parameter wird als Zeichenfolge, anstatt Array übergeben, warum nicht formData = JSON.stringify({asset: asset}) statt benutzerdefinierte Verarbeitung verwenden?

Wenn der Fall ist, dass Sie es als eine tatsächliche string übergeben wollen, sollten Sie es nicht mit => [] zulassen, nur :ip_address_ids würde ausreichen.

+0

Wenn ich 'formData = JSON.stringify (Asset)' mache, bekomme ich diesen Fehler in der Rails-Server-Konsole: 'Gestartet POST"/Assets "für :: 1 am 2017-02-07 07:15 : 29 0.100 Verarbeitung von AssetsController # erstellen, wie HTML 400 Bad Request in 3 ms Completed (Active: 0,7 ms) Action :: ParameterMissing (param fehlt oder der Wert leer ist: Asset): '' – Betax

+0

Try formData = JSON.stringify ({asset: asset}) ' – ErvalhouS

+0

Ich habe es gelöst! Ich verwende jetzt nur JSON und übersprang FormData vollständig. Meine POST-Zeichenfolge in asset.service.ts sieht nun folgendermaßen aus: 'return this.http.post (this.assetUrl, JSON.stringify ({Inhalt: Inhalt}), {Kopfzeilen}). Map ((Antwort: Antwort) = > Antwort. – Betax

Verwandte Themen