2017-04-18 1 views
3

난 레일 백엔드를 사용하여 각도 애플 리케이션을 개발하고 있습니다. 레일스가 사용할 수 있도록 매개 변수 해시를 포맷하는 데 문제가 있습니다. 데이터는 다 대다 관계이고 양식에는 중첩 된 특성이 들어 있습니다. 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 객체를 형식화하고 내용을 바꾸는 더 좋은 방법이 있습니까? 나는 그것을 할 올바른 방법을 모르겠습니다. 도움이 필요하다.

+0

': json'에'wrap_parameters'를 사용해 보셨습니까? http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html – Jon

+0

@Jon API 모드의 레일즈에서는 기본적으로 활성화되어있는 것처럼 보입니다. – ctilley79

+0

예, 기본적으로 모델 자체의 속성 만 래핑합니다. 'expense_categories_attributes'와 같은 추가 속성을 전달하는 경우에는이를 래핑 된 매개 변수에 명시 적으로 추가해야합니다. – Jon

답변

0

는이 같은 wrap_parametersexpense_expense_categories을 추가해야합니다 : 그것은 단지 기본적으로 모델 자체의 특성을 랩으로

wrap_parameters :expense, include: [:expense_expense_categories_attributes] 

추가 속성이 명시 적으로 wrap_parameters에 추가해야합니다.

+2

include : 내 모든 지출 속성을 나열해야했습니다. 나는 그것이 디폴트로 그것을 할 것이라고 생각했다. 그것이 Jon의 코멘트가 작동하지 않는 이유입니다. 고맙습니다. – ctilley79