1

我有兩個模型,用戶和用戶位置。用戶有許多用戶位置。通過嵌套屬性更新有很多記錄

我有收到以下PARAMS

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"auth_token=", "user"=> "user_locations_attributes"=>{"0"=>{"id"=>"3", "address"=>"Charles Sturt University", "postal_code_id"=>"0872", "radius"=>"4", "latitude"=>"-32.2327054", "longitude"=>"148.6272543", "suburb_id"=>"2"}, "1"=>{"id"=>"4", "address"=>"Charles Sturt University", "postal_code_id"=>"2003", "radius"=>"4", "latitude"=>"-35.2819998", "longitude"=>"149.1286843", "suburb_id"=>"1"}}}, "id"=>"2", "controller"=>"users", "action"=>"update"} 

在更新動作的更新動作我有

if user.update_attributes(user_params) 
    redirect_to users_url 
else 
    redirect_to root_url 
end 

相關的視圖代碼

- @data[:user].user_locations.each_with_index do |location, n| 
     input name="user[user_locations_attributes[#{n}[id]]]" value="#{location.id}" type="hidden" 

     input name="user[user_locations_attributes[#{n}[address]]]" value="#{ location.address }" type="text" 

     input name="user[user_locations_attributes[#{n}[postal_code_id]]" value="#{ if location.postal_code then location.postal_code.code end }" type="text" 

     input name="user[user_locations_attributes[#{n}[radius]]]" value="#{ location.radius }" type="text" 

     input name="user[user_locations_attributes[#{n}[latitude]]]" value="#{ location.latitude }" type="text" 

     input name="user[user_locations_attributes[#{n}[longitude]]]" value="#{ location.longitude }" type="text" 

     select.form-control name="user[user_locations_attributes[#{n}[suburb_id]]" type="text" 
     - @data[:suburbs].each do |suburb| 
      - if suburb.id == location.suburb.id 
      option value="#{suburb.id}" selected='' = suburb.name 
      - else 
      option value="#{suburb.id}" = suburb.name 

現在的問題是,雖然update_attributes返回是真的,Rails最終複製記錄,所以我n爲用戶提供兩個用戶位置記錄,而不僅僅是一條更新的記錄。如果我再次更新任何一個,那麼它會將這兩條記錄複製到四條記錄等等。我不確定有什麼問題。我如何解決這個問題來更新記錄而不是創建新記錄。

+0

你可以發佈你的視圖代碼嗎? –

+0

發表在我的問題。 – jason328

回答

2

第一件事:閱讀docs for fields_for helper並更換醜陋輸入的宣言和

= fields_for :locations do |location| 
    = location.text_field :address 
    = location.text_field :postal_code_id 
    = and.so.on 

第二件事的each_with_index循環:用user.update代替user.update_attributes ,導致最後一個已被棄用。

第三不要忘記添加:location_attributes您的user_params許可證聲明。