Rails’ scaffolding included only two kinds of text fields in the body of the form:
<%= f.text_field :name %> ... <%= f.text_area :description %>
Creating a field using text_field
results in a single-line form field, generating HTML
like:
<input id="person_name" name="person[name]" size="30" type="text" />
The text_area
results aren’t much more complicated, though they support
rows and columns rather than just a size in characters:
<textarea cols="40" id="person_description" name="person[description]" rows="20"></textarea>
Both of these use a convention to come up with an id
attribute, one that could be handy if you need to apply
stylesheets. Both also use a convention to create the name
attribute,
type[property]
, which you’ll need to know if
you want to create HTML forms by hand that feed into Rails controllers.
The rest is fairly generic—a size of 30 characters for the text_field
and 40 columns by 20 rows for the
text_area
.
If you want to add more attribute values to your text_area
or text_field
, or change the default values, you
can just add named parameters. For example, to change the size of the
description to 30 columns by 10 rows, you could write:
<%= f.text_area :description, :cols => 30, :rows => 10 %>
This will generate:
<textareacols="30"
id="person_description" name="person[description]"rows="10"
></textarea>
That same approach works for any attribute you want to add or
modify, though you should definitely be cautious about modifying the
name
attribute, which the Rails controller will use to figure
out which data maps to which object property.
There are two other options for text fields that Rails supports.
You’ve already seen Rails use the first, hidden fields, for things like the authenticity_token
field and the _method
hack, but both of those just kind of
happened. If you want to create an explicit hidden field, use the
hidden_field
method, like:
<%= f.hidden_field
:graduation_year %>
The graduation year value will be included in the page, but not visibly:
<input id="person_graduation_year" name="person[graduation_year]"
type="hidden"
/>
(Hidden fields are probably not what you want in forms creating new objects, but you may find other uses for them elsewhere in your applications.)
The other type of text field is useful mostly for passwords and
related tasks. You can create a password field using the password_field
method. In this example, it would be good for hiding the
secret
field, as in:
<%= f.password_field
:secret %>
which generates:
<input id="person_secret" name="person[secret]" size="30"
type="password
" />
That input field will put up asterisks for each character entered, hiding the value of the field from shoulder-surfing wrong-doers.
You can use text_area
,
text_field
, and the other
form-field-generator methods without the f
context object at the start of them. If
you want to do that, you need to specify an object directly in the
call, though, as the first argument. That would look like:
<%= text_area :person, :description %>
instead of:
<%= f.text_area :description %>
You can use either version within a form_for
tag, which is very helpful when you
need to mix code from multiple sources.
If you’re looking through the Rails API documentation and wondering why what they describe looks a bit different from what you’re writing, this may be the cause of the disconnect.