Posted about 5 years ago. Visible to the public. Repeats.

Popular mistakes when using nested forms

Here are some popular mistakes when using nested forms:

  • You are using fields_for instead of form.fields_for.
  • You forgot to use accepts_nested_attributes in the containing model. Rails won't complain, but nothing will work. In particular, nested_form.object will be nil.
  • The :reject_if option lambda in your accepts_nested_attributes call is defined incorrectly. Raise the attributes hash given to your :reject_if lambda to see if it looks like you expect.
  • If you are nesting forms into nested forms, each model involved needs accepts_nested_attributes with a correct :reject_if lambda.
  • You are iterating over associated records inside a form.fields_for block. Don't do that, fields_for already iterates for you.
  • You used form.fields_for |nested_form|, but continue to call form helpers (like text_field) on the containing form instead of nested_form.
  • When you have a has_many :through association, the nested form should be on the join model itself, instead of the model associated through the join model. _destroy checkboxes 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.

A bunch of books about building and maintaining large-scale Rails applications, all at a discounted price. Featuring best-selling books like Trailblazer, Fearless Refactoring, or Growing Rails Applications in Practice!

Author of this card:

Avatar
Henning Koch
Keywords:
error, debug
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Henning Koch to makandropedia