Module: Formtastic::Helpers::InputHelper
- Included in:
- FormBuilder
- Defined in:
- lib/formtastic/helpers/input_helper.rb
Overview
#input is used to render all content (labels, form widgets, error messages, hints, etc) for a single form input (or field), usually representing a single method or attribute on the form's object or model.
The content is wrapped in an <li> tag, so it's usually called inside an inputs block
(which renders an <ol> inside a <fieldset>), which should be inside a semantic_form_for
block:
<%= semantic_form_for @post do |f| %>
<%= f.inputs do %>
<%= f.input :title %>
<%= f.input :body %>
<% end %>
<% end %>
The HTML output will be something like:
<form class="formtastic" method="post" action="...">
<fieldset>
<ol>
<li class="string required" id="post_title_input">
...
</li>
<li class="text required" id="post_body_input">
...
</li>
</ol>
</fieldset>
</form>
Instance Method Summary collapse
-
#input(method, options = {}) ⇒ Object
Returns a chunk of HTML markup for a given
methodon the form object, wrapped in an<li>wrapper tag with appropriateclassandidattribute hooks for CSS and JS.
Instance Method Details
#input(method, options = {}) ⇒ Object
document the "guessing" of input style
Can we deprecate & kill :label, :hint & :prompt? All strings could be shifted to i18n!
Many many more examples. Some of the detail probably needs to be pushed out to the relevant methods too.
More i18n examples.
Returns a chunk of HTML markup for a given method on the form object, wrapped in
an <li> wrapper tag with appropriate class and id attribute hooks for CSS and JS.
In many cases, the contents of the wrapper will be as simple as a <label> and an <input>:
<%= f.input :title, :as => :string, :required => true %>
<li class="string required" id="post_title_input">
<label for="post_title">Title<abbr title="Required">*</abbr></label>
<input type="text" name="post[title]" value="" id="post_title" required="required">
</li>
In other cases (like a series of checkboxes for a has_many relationship), the wrapper may
include more complex markup, like a nested <fieldset> with a <legend> and an <ol> of
checkbox/label pairs for each choice:
<%= f.input :categories, :as => :check_boxes, :collection => Category.active.ordered %>
<li class="check_boxes" id="post_categories_input">
<fieldset>
<legend>Categories</legend>
<ol>
<li>
<label><input type="checkbox" name="post[categories][1]" value="1"> Ruby</label>
</li>
<li>
<label><input type="checkbox" name="post[categories][2]" value="2"> Rails</label>
</li>
<li>
<label><input type="checkbox" name="post[categories][2]" value="2"> Awesome</label>
</li>
</ol>
</fieldset>
</li>
Sensible defaults for all options are guessed by looking at the method name, database column
information, association information, validation information, etc. For example, a :string
database column will map to a :string input, but if the method name contains 'email', will
map to an :email input instead. belongs_to associations will have a :select input, etc.
Formtastic supports many different styles of inputs, and you can/should override the default
with the :as option. Internally, the symbol is used to map to a protected method
responsible for the details. For example, :as => :string will map to string_input,
defined in a module of the same name. Detailed documentation for each input style and it's
supported options is available on the *_input method in each module (links provided below).
Available input styles:
:boolean(see Inputs::BooleanInput):check_boxes(see Inputs::CheckBoxesInput):color(see Inputs::ColorInput):country(see Inputs::CountryInput):datetime_select(see Inputs::DatetimeSelectInput):date_select(see Inputs::DateSelectInput):email(see Inputs::EmailInput):file(see Inputs::FileInput):hidden(see Inputs::HiddenInput):number(see Inputs::NumberInput):password(see Inputs::PasswordInput):phone(see Inputs::PhoneInput):radio(see Inputs::RadioInput):search(see Inputs::SearchInput):select(see Inputs::SelectInput):string(see Inputs::StringInput):text(see Inputs::TextInput):time_zone(see Inputs::TimeZoneInput):time_select(see Inputs::TimeSelectInput):url(see Inputs::UrlInput)
Calling :as => :string (for example) will call #to_html on a new instance of
Formtastic::Inputs::StringInput. Before this, Formtastic will try to instantiate a top-level
namespace StringInput, meaning you can subclass and modify Formtastic::Inputs::StringInput
in app/inputs/. This also means you can create your own new input types in app/inputs/.
236 237 238 239 240 241 242 243 244 |
# File 'lib/formtastic/helpers/input_helper.rb', line 236 def input(method, = {}) method = method.to_sym = .dup # Allow options to be shared without being tainted by Formtastic [:as] ||= default_input_type(method, ) klass = namespaced_input_class([:as]) klass.new(self, template, @object, @object_name, method, ).to_html end |