2017-04-18 7 views
3

私はレールバックエンドを使用して角型アプリケーションを開発しています。レールが使用できるようにパラメータのハッシュをフォーマットする際に問題があります。データは多対多の関係であり、フォームにはネストされた属性が含まれています。 Railsでは、私のモデルはaccepts_nested_attributes_forヘルパーを利用しています。レールがどのようなフォーマットを想定しているのか正確には分かっていますが、POSTリクエストをすると、細部は1つしかありません。私は2つの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" 
      } 
     } 
    } 
} 

私のコードは次のとおりです。Railsが期待するもの

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

。ネストされた属性の

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()コンポーネントのメソッド:私のサービス・ファイル内の

onSubmit() { 
    this.expenseService.addExpense(this.expenseForm.value) 
     .subscribe(
     () => { 
      this.errorMessage = ''; 
     }, 
     error => { 
      this.errorMessage = <any>error; 
     } 
    ); 
    this.expenseForm.reset(); 
    } 

addExpense:

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); 
} 

私のメインフォーム

onAddExpenseCategories() { 

(<FormArray>this.expenseForm.get('expense_expense_categories_attributes')).push(
     new FormGroup({ 
     'expense_category_id': new FormControl(null, Validators.required), 
     'amount': new FormControl(null, [ 
      Validators.required 
     ]) 
     }) 
    ); 
    } 

更新:私はそれを働かせることができましたが、私は欲しいものに要求を操作するために神のひどい正規表現を使用しなければなりませんでした。非常に醜い選択肢でしたので、私はまだより良い選択肢を見つける必要があります。 JSONオブジェクトを書式設定してコンテンツを置き換えるより良い方法はありますか?私はそれを行う正しい方法がわからない。助けが必要。

+0

':json'に' wrap_parameters'を使ってみましたか? http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html – Jon

+0

@Jon APIモードのRailsではデフォルトで有効になっているようです。 – ctilley79

+0

はい、デフォルトではモデル自体の属性のみがラップされます。 'expense_categories_attributes'のような追加の属性を渡す場合は、これらをラップされたパラメータに明示的に追加する必要があります。 – Jon

答えて

0

次のようなwrap_parametersexpense_expense_categoriesを追加する必要があります。それは、デフォルトでモデル自体の属性を包むよう

wrap_parameters :expense, include: [:expense_expense_categories_attributes] 

追加の属性を明示的にwrap_parametersに追加する必要があります。

+2

私はすべての経費属性をインクルード:配列にリストアップしなければなりませんでした。私はそれがデフォルトでそれを行うだろうと思った。そのため、上記のJonのコメントは機能しませんでした。ありがとうございました。 – ctilley79

関連する問題