has を介して接続されたUser
associated のリストでレコードを更新しようとしています。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
が自動割り当てされないのはなぜですか? これをどのように明確な方法で実装できますか?