Popular mistakes when using nested forms
Here are some popular mistakes when using nested forms:
- You are using
- You forgot to use
accepts_nested_attributesin the containing model. Rails won't complain, but nothing will work. In particular,
:reject_ifoption lambda in your
accepts_nested_attributescall is defined incorrectly. Raise the attributes hash given to your
:reject_iflambda to see if it looks like you expect.
- If you are nesting forms into nested forms, each model involved needs
accepts_nested_attributeswith a correct
- You are iterating over associated records inside a
form.fields_forblock. Don't do that,
fields_foralready iterates for you.
- You used
form.fields_for |nested_form|, but continue to call form helpers (like
text_field) on the containing
- When you have a
has_many :throughassociation, the nested form should be on the join model itself, instead of the model associated through the join model.
_destroycheckboxes should probably be on the form for the join model, or you will end up with orphaned join model records.
- Nested records are validating the presence of their nesting parent record's foreign key. If you do this, you cannot create a new parent record together with a new child record and will need to save the parent before you can save the child. You can opt to only show the nested child form when the parent has been saved before, or simply let go of the validation.
- Your controller is slicing away the nested parameters.
- You are encountering a bug in Rails 2.3.8+ where nested attribute changes disappear.