Twitter Bootstrap Formalwear

Twitter Bootstrap Formalwear dresses up your Ruby on Rails forms with Twitter Bootstrap markup. It is a lightly-modified fork of twitter_bootstrap_form_for.

Unlike twitter_bootstrap_form_for, which overwrites existing Rails FormHelper methods, twitter_bootstrap_formalwear extends FormHelper with additional methods to generate labels, controls, control groups, and action blocks.

Because existing methods remain intact, you maintain the option to generate non-Bootstrap markup in your form if necessary.

Dependencies

Rails and Twitter Bootstrap (v2.0+), of course. A familiarity with Rails FormHelper usage and syntax will be helpful.

Installation

Add the dependency to your Gemfile:

gem 'twitter_bootstrap_formalwear'

Then run bundle from the project directory.

Usage/Syntax

Initializing a Form:

To use twitter_bootstrap_formalwear, first create a form using the same syntax as form_for or fields_for:

<%= formalwear_form_for (@person, :html => { :class => 'form-horizontal' }) do |f| %>

<%= formalwear_fields_for (:person, @client do |f| %>

Generating Form Elements:

twitter_bootstrap_formalwear extends form_for and fields_for with additional methods:

  • group
  • label
  • controls
  • actions

These methods can be used generically to create container elements:

<%= f.group do %>
    <!-- HTML goes here! -->
<% end %>

# =>
<div class="control-group">
    <!-- HTML goes here! -->
</div>

Or, more usefully, they can be prepended with a form element (of any type supported by the Rails FormHelper):

<%= f.text_field_group :first_name, :class => 'input-large' %>

# =>
<div class="control-group">
    <label class="control-label" for="first_name">First name</label>
    <div class="controls">
        <input type="text" name="first_name" value="" class="input-large" />
    </div>
</div>

If you need fine-grained control, you can generate only a Bootstrap label:

<%= f.text_field_label :first_name %>

# =>
<label class="control-label" for="first_name">First name</label>

...or a Bootstrap control:

<%= f.text_field_control :first_name, :class => 'input-large' %>

# =>
<div class="controls">
    <input type="text" name="first_name" value="" class="input-large" />
</div>

For you control freaks, the standard Rails FormHelper methods still work if needed:

<%= f.text_field :first_name, :class => 'input-large' %>

# =>
<input type="text" name="first_name" value="" class="input-large" />

More Usage Examples

Form actions:

<%= f.actions do %>
   <%= f.submit 'Sign up', :class => 'btn' %>
<% end %>

# =>
<div class="form-actions">
    <input class="btn" type="submit" value="Sign up">
</div>

Checkboxes (note that omitting the first argument will omit the label element):

<%= f.group do %>
    <%= f.check_box :remember_me %> Remember Me?
<% end %>

# =>
<div class="control-group">
    <div class="controls">
        <input id="remember_me" name="remember_me" type="checkbox" value="1" /> Remember Me?
    </div>
</div>

Add-ons and form help text: may or may not work yet. Documentation coming soon.

Bugs / Known Issues

You may have already noticed that the label method exists in form_for, even though I claim above that twitter_bootstrap_formalwear doesn't overwrite existing code. But since the new method dances so lightly (just adding class="control-label"), I think it's safe to simply overwrite the old method. Thoughts?

I've been using this fork successfully on my own projects, but some less common use cases may be buggy.

Todo

Tests!