我有两个模型,用户和用户位置。用户有许多用户位置。
我有一个接收以下参数的更新操作
{"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
返回true,但Rails最终会复制记录,因此我有两个用户位置记录,而不是只有一个更新记录。如果我再次更新任何一个,那么它将两个记录复制到四个记录等等。我不确定是什么问题。如何解决此问题以更新记录而不创建新记录。
答案 0 :(得分:2)
首先要做的事情是:阅读docs for fields_for helper并用
替换丑陋的输入声明和each_with_index循环= fields_for :locations do |location|
= location.text_field :address
= location.text_field :postal_code_id
= and.so.on
第二件事:使用user.update
代替user.update_attributes
,因为不推荐使用最后一个。
第三,不要忘记将:location_attributes
添加到user_params permit语句中。
答案 1 :(得分:0)
这是使用accepts_nested_attributes_for和fields_for让Rails处理所有嵌套关联工作的完美场景。
这是一个很好的教程解释所有:http://www.sitepoint.com/complex-rails-forms-with-nested-attributes/