Rails:accepts_nested_attributes_for解释

时间:2014-12-07 19:28:31

标签: ruby-on-rails mongoid rails-admin

我在我的rails应用程序中使用Mongoidrails_admin gem。这是我的两个模型文件:

模型Category

class Category
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, type: String

  embeds_many :tags
  # accepts_nested_attributes_for :tags  # this line will be added later
end

模型Tag

class Tag
  include Mongoid::Document
  field :name, type: String

  embedded_in :category
end

当我运行管理页面(由rails_admin生成)时,我遇到异常。在此例外情况中,有一条消息告诉我,我应该将accepts_nested_attributes_for :tag放在Category模型中。放完该行后,不会出现错误。

所以,我的问题是:请为我解释accepts_nested_attributes_for的目的。我看到很多教程,通常这两行一起使用:

   embeds_many :tags
  accepts_nested_attributes_for :tags

为什么?为什么不只有一行?

@Edit:我也看过这个链接。但我仍然不太了解。 explanation

谢谢:)

1 个答案:

答案 0 :(得分:1)

来自docs

嵌套属性允许您通过父级保存关联记录的属性。默认情况下,嵌套属性更新已关闭,您可以使用#accepts_nested_attributes_for类方法启用它。启用嵌套属性时,将在模型上定义属性编写器。

换句话说,接受嵌套属性允许您直接从类别模型中保存标记(即轨道)

另一方面,embeds_many是添加类别和标签之间的关系(即mongoid)。没有#accepts_nested_attributes它仍然有效,但不允许你从父节点一步保存。

这是一个很好的例子:

在一对一关联上启用嵌套属性允许您一次创建成员和头像:

params = { member: { name: 'Jack', avatar_attributes: { icon: 'smiling' } } } 
# both member and avatar passed in one hash
member = Member.create(params[:member])
member.avatar.id # => 2
member.avatar.icon # => 'smiling'

可以找到一个非常好的视频来进一步解释这个概念here