-
Notifications
You must be signed in to change notification settings - Fork 330
Edit Associated Action Flow
When 'add another' button is clicked, a GET request to the action 'edit_associated' is sent to add a row. If subform has a select with existing records and 'add existing' button, it will send request to 'edit_associated' too, with ID of the selected record in the associated_id
param. The request is sent to the controller of model which has the association, for example model A has subform for model B, adding row for B will send the request to the controller for A. If there is a nested subform for model C under B subform, adding a row for C will send the request to the controller for B.
In both cases, these methods are called in the following order:
- edit_associated
- do_edit_associated, which sets instance variables:
- @scope, with
scope
param, present if it's a nested subform. - @parent_record, the parent record of the added row, a model for the current controller.
- @column for the
child_association
param, the association column where new row will be added, a column in the current controller. - @record, with the object for the added row.
- Depending if the row is added in a new record or existing record, ID param will be present or not, and different method is called to set @parent_record:
- If ID param is present, the parent record is loaded with
find_if_allowed
checking permission for:update
. - If there is no ID param,
new_parent_record
is called to build a new object for the parent model.-
new_model
to create a new object - It will set the values from constraints if controller is embedded, unless , and set the parent association if form was open on a nested scaffold.
-
- If ID param is present, the parent record is loaded with
-
find_associated_record
ifassociated_id
param is present, for 'add existing' button. -
build_associated
if there is noassociated_id
param, to build the object to add a row. If association is a through association, it gets the record in the through association if it's belongs_to or has_one, or create a new record if it's has_many, and builds the object for the new row in that object of the through association.
- @scope, with
- do_edit_associated, which sets instance variables:
In both cases, @record will have @parent_record added to the reverse association, if reverse association is defined.
Then it will render the following view and partials:
- edit_associated.js.erb, with JS to add the new row to the subform.
- _form_association_record.html.erb to render the HTML for the new row.