2017-02-06 54 views
0

我正在構建一個從Rails 5 API獲取數據的Angular 2前端應用程序。這是一種網絡庫存應用程序。來自Angular2前端的Rails has_many輸入不會保存

我在Angular2中有一個資產表單,並且有一個資產的ip_addresses的多選輸入。

我無法讓Rails在後端接受這些數據。

資產對象:

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

這裏是我的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());} 

這是Rails的服務器控制檯什麼即時得到:

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 

我已經允許ip_address_ids的參數

​​

奇怪的是,如果我在Chrome中使用高級REST客戶端它是成功的。

Here's an image of the REST Client

在Rails服務器控制檯結果:

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"]}} 

我覺得現在的問題是,角發送ID作爲一個字符串和REST客戶端發送的ID作爲一個字符串數組。

有關如何解決這個問題的任何想法?

+0

嘗試在模型(後端)上設置'accep_nested_attributes'並將'ip_address_ids'的所有出現次數(前端和後端)更改爲'ip_address_ids_atrributes'。 – developer033

+0

僅當我想要構建新的IP地址時,這不僅僅是這樣嗎?該IP已經存在於數據庫中。 – Betax

+0

你確定它已經存在?正如你所提到的,它不允許你傳遞參數..'不允許的參數:ip_address_ids'。 – developer033

回答

0

你的ip_address_ids PARAMS被作爲字符串傳遞,而不是數組,爲什麼不使用formData = JSON.stringify({asset: asset})而不是自定義處理?

如果是,你想通過它作爲一個實際的string你不應該允許它與=> [],只有:ip_address_ids就足夠了。

+0

當我做'formData = JSON.stringify(資產)'我在Rails服務器控制檯得到這個錯誤: '在2017-02-07 07:15開始POST「/ assets」爲:: 1 :29 +0100 處理由AssetsController#創建爲HTML 完成400錯誤的請求在3毫秒(ActiveRecord的:爲0.7ms) 的ActionController :: ParameterMissing(參數是丟失或爲空值:資產):' – Betax

+0

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

+0

我解決了它!我現在只使用JSON並完全跳過FormData。我在asset.service.ts中的POST字符串現在看起來像這樣:'this this.http.post(this.assetUrl,JSON.stringify({asset:asset}),{headers})。map((response:Response)= >迴應。json());' 我也有這在我的asset-form.component.html:'ngValue] =「address.id.toString()」' 我已列入我​​的asset_controller陣列。 rb in Rails: ':ip_address_ids => []' – Betax