8

has を介して接続されたUserassociated のリストでレコードを更新しようとしています。Addresses

私がjavascriptを介して送信しているリクエスト本文は次のとおりです。

{"id":10,"name":"John Smith", "address_ids":[4,8]}

これは、Railsサーバー ログに記録されているものです。

2013-10-03 16:30:43 +0200 に 127.0.0.1 の PUT "/api/users/10" を開始しました

Api::UsersController#update による処理を HTML として

パラメータ: {"id"=>"10", "name"=>"John Smith", "address_ids"=>[4, 8], "user"=>{"id"=>"10", "name "=>"ジョン・スミス"}}

上記で注目すべきことは、ログによると、address_ids配列がuserハッシュ化されていないことです。

コントローラーでは、強力なパラメーターを使用して、次のUserように更新しています。

attributes = params.require(:user).permit(:id, :name, {:address_ids => []}) 
@user.update_attributes(attributes)

問題は、更新時点で属性に address_ids が含まれていないため、関連するレコードが更新されないことです。

一時的な解決策

次のように、強力なパラメーター チェックから戻った後にaddress_idsキーを手動で割り当てるという問題を回避しました。attributes

attributes = params.require(:user).permit(:id, :name, {:address_ids => []})
if params.has_key?(:address_ids)   
  attributes[:address_ids] = params[:address_ids] 
end
@user.update_attributes(attributes)

これは正常に動作しますが、これがどのように動作するはずなのか私には思えませんか? adderss_idsが自動割り当てされないのはなぜですか? これをどのように明確な方法で実装できますか?

4

1 に答える 1

9

アドレスをユーザーと共に保存する場合は、クライアント側のコードaddress_idsが次のようにパラメーターを送信するようにする必要があります。

Parameters: {"user"=>{"id"=>"10", "name"=>"John Smith", "address_ids"=>["4", "8"]}}

入力フィールドname属性は次のようになります。

<input name="user[address_ids][]">

また、パラメータでユーザー属性が繰り返されているように見えるので、クライアント コードがどのようにリクエストを生成しているかを注意深く確認することをお勧めします。

于 2013-10-04T12:53:41.600 に答える