Skip to content

Commit

Permalink
Merge pull request rails#13214 from JuanitoFatas/master
Browse files Browse the repository at this point in the history
Some improvements on building nested forms. [ci skip]
  • Loading branch information
chancancode committed Dec 6, 2013
2 parents 01c9782 + a771376 commit 92812ba
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions guides/source/form_helpers.md
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,7 @@ end

This creates an `addresses_attributes=` method on `Person` that allows you to create, update and (optionally) destroy addresses.

### Building the Form
### Nested Forms

The following form allows a user to create a `Person` and its associated addresses.

Expand All @@ -882,16 +882,18 @@ The following form allows a user to create a `Person` and its associated address
```


When an association accepts nested attributes `fields_for` renders its block once for every element of the association. In particular, if a person has no addresses it renders nothing. A common pattern is for the controller to build one or more empty children so that at least one set of fields is shown to the user. The example below would result in 3 sets of address fields being rendered on the new person form.
When an association accepts nested attributes `fields_for` renders its block once for every element of the association. In particular, if a person has no addresses it renders nothing. A common pattern is for the controller to build one or more empty children so that at least one set of fields is shown to the user. The example below would result in 2 sets of address fields being rendered on the new person form.

```ruby
def new
@person = Person.new
3.times { @person.addresses.build}
2.times { @person.addresses.build}
end
```

`fields_for` yields a form builder that names parameters in the format expected the accessor generated by `accepts_nested_attributes_for`. For example when creating a user with 2 addresses, the submitted parameters would look like
The `fields_for` yields a form builder. The parameters' name will be what
`accepts_nested_attributes_for` expects. For example when creating a user with
2 addresses, the submitted parameters would look like:

```ruby
{
Expand All @@ -913,7 +915,7 @@ end

The keys of the `:addresses_attributes` hash are unimportant, they need merely be different for each address.

If the associated object is already saved, `fields_for` autogenerates a hidden input with the `id` of the saved record. You can disable this by passing `include_id: false` to `fields_for`. You may wish to do this if the autogenerated input is placed in a location where an input tag is not valid HTML or when using an ORM where children do not have an id.
If the associated object is already saved, `fields_for` autogenerates a hidden input with the `id` of the saved record. You can disable this by passing `include_id: false` to `fields_for`. You may wish to do this if the autogenerated input is placed in a location where an input tag is not valid HTML or when using an ORM where children do not have an `id`.

### The Controller

Expand Down Expand Up @@ -944,15 +946,17 @@ class Person < ActiveRecord::Base
end
```

If the hash of attributes for an object contains the key `_destroy` with a value of '1' or 'true' then the object will be destroyed. This form allows users to remove addresses:
If the hash of attributes for an object contains the key `_destroy` with a value
of `1` or `true` then the object will be destroyed. This form allows users to
remove addresses:

```erb
<%= form_for @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= check_box :_destroy%>
<%= addresses_form.check_box :_destroy%>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
...
Expand Down

0 comments on commit 92812ba

Please sign in to comment.