【问题标题】:Updating has many records via nested attributes通过嵌套属性更新有许多记录
【发布时间】:2013-08-29 17:04:30
【问题描述】:

我有两个模型,用户和用户位置。一个用户有很多用户位置。

我有一个接收以下参数的更新操作

{"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 最终会复制记录,因此我有两个用户位置记录,而不是只有一个更新的记录。如果我再次更新其中任何一个,那么它会将这两条记录复制到四条记录等。我不确定出了什么问题。如何解决此问题以更新记录而不创建新记录。

【问题讨论】:

  • 您也可以发布您的视图代码吗?
  • 在我的问题中发布。

标签: ruby-on-rails parameters attributes ruby-on-rails-4 nested-attributes


【解决方案1】:

首先要做的事:阅读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 许可声明中。

【讨论】:

    【解决方案2】:

    这是使用accepts_nested_attributes_forfields_for 让Rails 处理所有嵌套关联工作的完美场景。

    这里有一个很好的教程来解释这一切:http://www.sitepoint.com/complex-rails-forms-with-nested-attributes/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2013-11-03
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      相关资源
      最近更新 更多