Formular: Bootstrap
Last updated 05 August 2017 formular v0.2The Bootstrap builder can render horizontal forms, inline forms, and vertical forms, which is the default. Currently, the API to render elements is identical for BS3 and BS4.
Where’s the EXAMPLE CODE?
Vertical Forms
To display form elements from to top to bottom use the vertical form builder.
= form(model.contract, url, builder: :bootstrap3) do |f|
= f.row
= f.input :title, label: "Title", inline_col_class: ['col-md-6']
= f.input_group :title, label: "URL Slug", inline_col_class: ['col-md-6'] do |input|
= input.group_addon('<input type="checkbox" value="1"/>')
= input.control
= f.input_group :url_slug, label: "URL", left_addon: 'http://', right_addon: '.com'
= f.select :select_roles, label: "Roles", collection: roles_array, prompt: 'Choose a role'
= f.inline_radio :select_roles, label: "Inline radios", collection: [[1, "Yes"], [2, "No"], [3, "I really don't know"]]
= f.inline_checkbox :select_roles, label: "Inline checkboxes", collection: options_array
This will render a form as follows. Note how items without .row are aligned vertically by BS.

Form
As always, the ###fixme needs at least two arguments: model and url.
form(model.contract, url) do |f|
Builder
The default builder needs to be set.
Formular::Helper.builder = :bootstrap3
This can be overridden in the single form using the option builder, for example to have an inline form.
form(model.contract, url, builder: :bootstrap3_inline)
Input
The input method receives all Formular options (:placeholder, :label).
= f.input :title, label: "Title"
Group Addon
You can render a control composition using input_group.
= f.input_group :title, label: "URL Slug", inline_col_class: ['col-md-6'] do |input|
= input.group_addon('<input type="checkbox" value="1"/>')
= input.control
Note that control allows you to output the actual input control at any point.
Input Options
The following snippet is an example of available options.
= form(input_options, url, enctype: 'multipart/form-data', builder: :bootstrap3) do |f|
= f.input :id, type: 'hidden', value: "some_id"
= f.input :email, type: 'email', label: "Email"
= f.input :password, type: 'password', label: "Password"
= f.input :image, type: 'file', label: "Image"
= f.input :background_color, type: 'color', label: "Background Colour", hint: "Select the background colour for your image!"
= f.input :number, type: 'number', label:"Number", disabled: true, value: '5'
= f.submit content: "Submit!", class: ['btn-lg']
Which will render:

Type
Use type to have for example hidden, password or file type. Here the list of textual input types.
Make sure to add enctype: 'multipart/form-data' as argument in the form to have the full path from the file type input.
This might be done automatically in future releases.
Value
Use value to set the content of an input, in our example above id is set as "some_id".
Help Block
Use hint to have an help_block with some useful words.
Select
The select method receives the same options of input (not type and prompt instead of placeholder) plus the options for multiple choices: multiple and collection.
= form(select_box, url, builder: :bootstrap3) do |f|
= f.select :select_basic_roles, label: "Basic Roles", collection: roles_array, prompt: 'Choose a role'
= f.select :select_roles, label: "Basic Roles with value", collection: roles_array, value: "Admin"
= f.select :select_complex_roles, label: "Complex Roles", collection: complex_role, value: "i"
= f.select :select_multi_complex_roles, label: "Multiple Complex Roles", collection: complex_role, multiple: 'multiple'
Which will render:

For multiple choices multiple: 'multiple' needs to be one of the options and, of course, collection too.
Here below the arrays used in this example:
roles_array = [["Admin", 1], ["Owner", 2], ["Maintainer", 3]]
complex_role = [['Team', [['England', 'e'], %w(Italy i),['Germany', 'g']]],['Roles', [['Fullback', 0], ['Hooker', 1], ['Wing', 2]]]]
Check and Radio box
The checkbox and radiobox have the same API
.col-sm-6
= f.checkbox :is_public, label: "Basic Checkbox", value: true
= f.checkbox :is_not_public, label: "Basic Checked Checkbox", checked: 'checked'
= f.checkbox :check_roles, label: "Multiple Checkbox", multiple: 'multiple', collection: roles_array
.col-sm-6
= f.radio :is_public, label: "Basic Radio", value: true
= f.radio :is_not_public, label: "Basic Checked Radio", checked: 'checked'
= f.radio :check_roles, label: "Multiple Radio", multiple: 'multiple', collection: roles_array
= f.submit content: "Submit!", class: ['btn-lg']
Which will render:

When value and the form property (is_public)’s value are matching the check/radiobox will be checked - so make sure to set it properly.
Override the ticked/checked state using checked: 'checked'
Inline Form
To render an inline form you just need to change the builder.
= form(model.contract, url, builder: :bootstrap3_inline) do |f|
= f.input :title
= f.input :url_slug, label: 'url slug', placeholder: "URL slug", label_options: { class: ["sr-only"] }
=f.submit(content: "Submit!")

Horizontal Form
= form(model.contract, url, builder: :bootstrap3_horizontal) do |f|
= f.input_group :title, label: "Title" do |input|
=input.control
=input.group_btn("<a class='btn btn-default' href='/'>Suprise Me</a>")
= f.input :url_slug, label: 'URL'
= f.textarea :content, placeholder: "And your story...", rows: 9, label: 'Content'
= f.select :select_roles, collection: roles_array, label: 'Role', prompt: 'Choose a role'
= f.submit content: "Submit!", class: ['btn-lg']

