accepts_nested_attributes_for
- 1.0.0
- 1.1.0
- 1.1.1
- 1.1.6
- 1.2.0
- 1.2.6
- 2.0.0
- 2.0.1
- 2.0.3
- 2.1.0
- 2.2.1
- 2.3.2 (0)
- 2.3.8 (38)
- 3.0.0 (0)
- 3.0.5 (0)
- 3.0.7 (0)
- 3.0.9 (-3)
- 3.1.0 (0)
- 3.2.1 (1)
- 3.2.3 (0)
- 3.2.8 (0)
- 3.2.13 (0)
- What's this?
accepts_nested_attributes_for(*attr_names)
public
Defines an attributes writer for the specified association(s). If you are using attr_protected or attr_accessible, then you will need to add the attribute writer to the allowed list.
Supported options:
- :allow_destroy
- If true, destroys any members from the attributes hash with a _delete key and a value that evaluates to true (eg. 1, ‘1’, true, or ‘true’). This option is off by default.
- :reject_if
- Allows you to specify a Proc that checks whether a record should be built for a certain attribute hash. The hash is passed to the Proc and the Proc should return either true or false. When no Proc is specified a record will be built for all attribute hashes that do not have a _delete that evaluates to true.
Examples:
# creates avatar_attributes= accepts_nested_attributes_for :avatar, :reject_if => proc { |attributes| attributes['name'].blank? } # creates avatar_attributes= and posts_attributes= accepts_nested_attributes_for :avatar, :posts, :allow_destroy => true
A very thorough explanation of use
Ryan Daigle has a great article about 2.3’s new nest forms which does a really good job of explaining how to use this and some of the potential gotchas. Highly recommended:
http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes
Be careful with name of attribute writer
If restricting access to attributes you normally get code like
attr_accessible :foo,
When using these nested attributes you end up with code like
attr_accessible :foo, :bar_attributes
Its very easy to leave of the _attributes suffix e.g
attr_accessible :foo, :bar
which will cause you all sorts of problems
Dont use _delete
Most blog articles about accepts_nested_attributes_for, including the one from @mattsa and @annaswims, tell you to add a
'_delete' => 1
when you want a deletion checkbox, hidden attribute, etc.
But this stopped being true a while ago. This is just a “Watch Out!” Make sure you use
'_destroy' => 1
instead.
nested attribute gotcha
Just adding to what @diabolist said :
class House
has_many :doors accepts_nested_attributes_for :doors attr_accesible :address, :doors_attributes # NOTE its plural
end
More Docs and Explanation
You probably want to look at the class level docs
http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods
(cut and paste, apidocks can’t render the above for some reason)
Rails documentation for nested attributes
ActiveRecord/NestedAttributes/ClassMethods
(don’t follow this link, the url interpreter isn’t rendering it correctly :(, but the correct link is at the top of this page)
Nested Model Forms
For a good example of nested model forms check out the rails blog.


