난 레일 백엔드를 사용하여 각도 애플 리케이션을 개발하고 있습니다. 레일스가 사용할 수 있도록 매개 변수 해시를 포맷하는 데 문제가 있습니다. 데이터는 다 대다 관계이고 양식에는 중첩 된 특성이 들어 있습니다. Rails에서 내 모델은 accepts_nested_attributes_for
헬퍼를 사용합니다. 레일스의 형식이 정확히 무엇인지 알고 있지만, POST
요청을하면, 하나의 사소한 세부 사항이 있습니다. 두 개의 param 해시 아래에 나열 할 것입니다. 하나는 Angular가 생산하는 것이고 다른 하나는 Rails가 기대하는 것입니다.각도 4 & 레일 5 게시물 요청 JSON 서식
각도 요청은 레일이 expense_expense_categories
속성의 중첩 레이어가 더 깊을 것으로 예상됩니다. 나는 왜 레일이 그것을 필요로하는지 결코 이해하지 못했다. 어떤 각도로 인해 내게 논리적으로 보입니다. 제 질문은 .. 매개 변수를 각도로 포맷하려면 어떻게해야합니까? 지금까지 내가 가진 것을 살펴보면, 각도 모범 사례를 만족시키는 방식으로이 작업을 수행하고 있습니까? 각도
다음과 같이 각도에서
{
"expense": {
"date": "2017/12/12",
"check_number": "122",
"debit": "0",
"notes": "har",
"amount": "24",
"payee_id": "334",
"expense_expense_categories_attributes": {
"210212312": {
"expense_category_id": "72",
"amount": "12"
},
"432323432": {
"expense_category_id": "73",
"amount": "12"
}
}
}
}
내 코드는 다음과 같습니다 레일이 무엇을 기대
{
"expense": {
"date": "2017/4/13",
"check_number": "132",
"debit": "0",
"notes": "har",
"amount": "24",
"payee_id": "334"
},
"expense_expense_categories_attributes": [{
"expense_category_id": "59",
"amount": 12
},
{
"expense_category_id": "62",
"amount": 11
}
]
}
. 구성 요소의
onSubmit()
방법 :
addExpense(expense: Expense): Observable<any> {
let headers = new Headers({'Content-Type': 'application/json'});
let options = new RequestOptions({headers: headers});
return this.http.post('http://localhost:3000/expenses', expense, options)
.map(
(res: Response) => {
const expenseNew: Expense = res.json();
this.expenses.push(expenseNew);
this.expensesChanged.next(this.expenses.slice());
})
.catch(this.handleError);
}
내 주요 형태 : 중첩 된 속성
private initForm() {
let expense_expense_categories_attributes = new FormArray([]);
this.expenseForm = this.fb.group({
id: '',
date: '',
amount: '',
check_number: '',
debit: '',
payee_id: '',
notes: '',
expense_expense_categories_attributes: expense_expense_categories_attributes
});
}
내 FormArray :
내 서비스 파일에onSubmit() {
this.expenseService.addExpense(this.expenseForm.value)
.subscribe(
() => {
this.errorMessage = '';
},
error => {
this.errorMessage = <any>error;
}
);
this.expenseForm.reset();
}
addExpense
업데이트 : 나는 그것을 작동시킬 수 있었지만, 나는 끔찍한 정규 표현식을 사용하여 내가 원하는 것에 대한 요청을 조작해야했다. 그것은 매우 못생긴 옵션이었고 그래서 나는 여전히 더 나은 선택을 찾아야했습니다. JSON 객체를 형식화하고 내용을 바꾸는 더 좋은 방법이 있습니까? 나는 그것을 할 올바른 방법을 모르겠습니다. 도움이 필요하다.
': json'에'wrap_parameters'를 사용해 보셨습니까? http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html – Jon
@Jon API 모드의 레일즈에서는 기본적으로 활성화되어있는 것처럼 보입니다. – ctilley79
예, 기본적으로 모델 자체의 속성 만 래핑합니다. 'expense_categories_attributes'와 같은 추가 속성을 전달하는 경우에는이를 래핑 된 매개 변수에 명시 적으로 추가해야합니다. – Jon