如何使用accepts_nested_attributes_for保存模型?

时间:2013-02-23 20:03:11

标签: ruby-on-rails-3

我有一个模型用户,有大约40个表单字段。然后我在表单中有3个属于Child模型的字段。它们是:年龄,性别,:家庭。

我查看了accepts_nested_attributes_for的文档,并对如何将Child模型保存到数据库感到困惑。

在我的UsersController中,我有以下内容:

@user = User.new(params[:user])
...
@user.save

现在在Rails文档中,他们有一个名为Member的模型,在其中,has_many:posts和accepts_nested_attributes_for:posts。他们像这样保存成员模型:

params = { :member => {
  :name => 'joe', :posts_attributes => [
    { :title => 'Kari, the awesome Ruby documentation browser!' },
    { :title => 'The egalitarian assumption of the modern citizen' },
    { :title => '', :_destroy => '1' } # this will be ignored
  ]
}}

member = Member.create(params['member'])

但是我已经有一个与params [:user]等效的params [:member]。我的3个孩子的领域,:年龄,性别,和:家庭在params [:age],params [:gender]和params [:home]。所以我想我的问题是如何保存用户模型并将3个子字段保存在子模型中?

1 个答案:

答案 0 :(得分:0)

您需要正确设置表单才能使用accepts_nested_attributes_for

因此,在您的User模型中,您将拥有:

accepts_nested_attributes_for :child

并以您的形式,您可以这样做:

form_for @user do |f|
  f.text_field :name #or whatever your user attributes

  f.fields_for :child, @user.build_child do |child|
    child.text_field :age
    #etc
  end
end

现在rails应该将child对象构建为user对象的一部分,并且您应该能够一次创建userchild对象。 / p>

您是child还是children accepts_nested_attributes_for完全取决于userchild之间的关系。如果只有user has_one :child,则上述内容就足够了。如果是has_many关系,则您需要将符号更改为:children并将@user.build_child更改为@user.children.build.

此外,请不要忘记将(child|children)_attributes添加到attr_accessible模型上的user,否则您将无法通过表单提交进行大量分配。< / p>