モデル Sensor と、別のモデル Watchhas_many
との関係があります。accepts_nested_attributes_for
センサーを更新するフォームには、次のようなものがあります
<%= sensor_form.fields_for :watches do |watches_form| %>
<%= watches_form.label :label %><br />
<%= watches_form.text_field :label %>
<% end %>
これは、センサーに属する作成済みのウォッチを編集できるようにするためのものです。
この呼び出しは、次のようにフォーム入力を吐き出します。
<input name="sensor[watches_attributes][0][label]" ... />
<input name="sensor[watches_attributes][0][id]" ... />
これが送信さparams
れると、Sensor コントローラー内のオブジェクトは assoc のようなものを取得します
"sensor" => {
"id"=>"1",
"watches_attributes"=> {
"0"=>{"id" => "1", "label" => "foo"},
"1"=>{"id" => "2", "label" => "bar"}
}
}
has_many
呼び出し時にaccepts_nested_attributes_for
update が機能するためには@sensor.update_attributes
、その属性キーが実際には配列にマップされている必要があるようです。
例で見てきたことから、 、 、およびの組み合わせによりhas_many
、結果のオブジェクトを直接渡して、関連する各オブジェクトを意図したとおりに更新できるはずです。代わりに、センサーはエラーなしで実行されますが、Watch オブジェクトは更新されません (配列ではなくハッシュにマップされるため)。accepts_nested_attributes_for
sensor_form.fields_for
params
@sensor.update_attributes
"watches_attributes"