4

我在以多级嵌套形式更新数据时遇到问题。我使用部分来包含创建和更新视图的所有字段,并且我在创建时没有问题。只有更新。

基本上结构(简化)是:

user has_one profile
profile has_many addresses

form_for @user do |u|
  u.fields_for :profile do |p|
    p.fields_for :addresses do |a|

就像我说的,创建用户、个人资料和地址工作正常。只有在我尝试更新之前,我才会发现问题。我没有收到错误,它实际上表明它已成功更新。它实际上确实正确更新了用户和个人资料字段,而不是地址字段。

这是堆栈跟踪中更新的参数。(再次总结和格式化)

Parameters: {"controller"=>"profiles", "action"=>"update", "_method"=>"put", "id"=>"1", 
  "user"=>{"login" => "username",
    "profile_attributes"=>{"first_name"=>"Admin",
      "addresses_attributes"=>{
        "0"=>{"address"=>"123 Address Ave.", "city"=>"Cityville", "state"=>"CA"}
      }
    }
  }
}

我能找到的所有文档都只显示 1 个嵌套形式,所以我不确定我是否正确使用 update_attributes 超过 1 级深度。

有什么想法吗?

4

4 回答 4

6

您是否attr_accessible在模型中的任何地方使用,将允许进行批量分配的字段列入白名单?如果是这样,那么您还需要添加

attr_accessible :address_attributes

允许将这些属性传递给update_attributes.

如果您还没有使用attr_accessible(或者它不是推荐的 Sister attr_protected),那么不要添加此行,因为它会停止保存您的所有属性。

于 2011-02-01T11:15:39.263 回答
4

我遇到了类似的问题。在我的情况下,这是因为 accept_nested_attributes_for 类方法中的“reject_if”子句。

accept_nested_attributes_for :player, :reject_if => proc { |attributes| 属性['full_name'].blank? }

通过在播放器“full_name”属性中留下一个空字符串,Rails 甚至不会尝试更新嵌套表单中的属性。就我而言,我意识到我不需要reject_if 子句,所以我通过删除它来解决问题。

于 2012-04-10T16:03:26.940 回答
1

我创建了一个名为cocoon的宝石,它可以帮助你。它适用于标准 Rails 表单、formtastic 或 simple-form。

gem 适用于多个嵌套级别。github 上的自述文件能让你轻松入门。如果您需要更多帮助,请告诉我。

于 2011-02-01T10:49:36.003 回答
1

我在更新时也遇到了同样的问题,而不是在创建时。我的班级模型是 Lecture has_many 小部件

class Lecture < ActiveRecord::Base
  attr_accessible :name , :order , :html, :widgets_attributes 
  has_many :widgets
  accepts_nested_attributes_for :widgets,  :allow_destroy => true
end

class Widget < ActiveRecord::Base
    belongs_to :lecture
    attr_accessible :width, :height, :xpos, :ypos, :source
end

Widget 类的最后一行改变了一切。

于 2012-05-30T06:44:35.917 回答