Here are some popular mistakes when using nested forms:
- You are using
fields_for
instead ofform.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 benil
. - The
:reject_if
option lambda in youraccepts_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 (liketext_field
) on the containingform
instead ofnested_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 not building the right amount of associated records in the required controller actions with
@model.nested_model.build
.- If you are adding fields dynamically by using JavaScript, then the form helper method should take care of this:
new_nested_record = f.object.send(nested_association).klass.new
.
- If you are adding fields dynamically by using JavaScript, then the form helper method should take care of this:
- You have not added the
id
attribute into the nested params:params.permit(:attribute_1, ..., nested_attributes: [:id, ...])
. This will render additional records from the last cached response in form round trips, since theid
can not be assigned by the server while it may be outputtingUnpermitted parameter: :id
within the console. - You are not setting the
inverse_of
for ahas_many through
association. Rails will then not be able to process a collection assignment Show archive.org snapshot , since it can't find the inverse association. - You are encountering a bug in Rails 2.3.8+ where nested attribute changes disappear.
Posted by Henning Koch to makandra dev (2011-07-11 21:26)