嵌套形式& update_attributes方法

时间:2010-09-22 08:30:28

标签: ruby-on-rails nested-forms

我无法在多级嵌套表单中更新数据。我使用partials来包含create&的所有字段。更新视图,我没有创建问题。只有更新。

基本上结构(简化)是:

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 个答案:

答案 0 :(得分:6)

您是否在模型中的任何位置使用attr_accessible,以便将允许进行批量分配的字段列入白名单?如果是,那么你将also need to add

attr_accessible :address_attributes

允许将这些属性传递给update_attributes

如果您尚未使用attr_accessible(或者不推荐使用姐妹attr_protected),则添加此行,因为它会停止所有保存属性。

答案 1 :(得分:4)

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

  

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

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

答案 2 :(得分:1)

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

gem使用多个嵌套级别。 github上的自述文件应该让你很容易入手。如果您需要更多帮助,请告诉我。

答案 3 :(得分: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类的最后一行完全不同。