ehoch_simple_form 2.0.2.dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. data/CHANGELOG.md +257 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +797 -0
  4. data/lib/generators/simple_form/USAGE +3 -0
  5. data/lib/generators/simple_form/install_generator.rb +32 -0
  6. data/lib/generators/simple_form/templates/README +12 -0
  7. data/lib/generators/simple_form/templates/_form.html.erb +13 -0
  8. data/lib/generators/simple_form/templates/_form.html.haml +10 -0
  9. data/lib/generators/simple_form/templates/_form.html.slim +10 -0
  10. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb.tt +181 -0
  11. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +26 -0
  12. data/lib/simple_form.rb +215 -0
  13. data/lib/simple_form/action_view_extensions/builder.rb +338 -0
  14. data/lib/simple_form/action_view_extensions/form_helper.rb +74 -0
  15. data/lib/simple_form/components.rb +20 -0
  16. data/lib/simple_form/components/errors.rb +35 -0
  17. data/lib/simple_form/components/hints.rb +18 -0
  18. data/lib/simple_form/components/html5.rb +26 -0
  19. data/lib/simple_form/components/label_input.rb +15 -0
  20. data/lib/simple_form/components/labels.rb +79 -0
  21. data/lib/simple_form/components/maxlength.rb +41 -0
  22. data/lib/simple_form/components/min_max.rb +50 -0
  23. data/lib/simple_form/components/pattern.rb +34 -0
  24. data/lib/simple_form/components/placeholders.rb +16 -0
  25. data/lib/simple_form/components/readonly.rb +22 -0
  26. data/lib/simple_form/core_ext/hash.rb +16 -0
  27. data/lib/simple_form/error_notification.rb +48 -0
  28. data/lib/simple_form/form_builder.rb +472 -0
  29. data/lib/simple_form/helpers.rb +12 -0
  30. data/lib/simple_form/helpers/autofocus.rb +11 -0
  31. data/lib/simple_form/helpers/disabled.rb +15 -0
  32. data/lib/simple_form/helpers/readonly.rb +15 -0
  33. data/lib/simple_form/helpers/required.rb +35 -0
  34. data/lib/simple_form/helpers/validators.rb +44 -0
  35. data/lib/simple_form/i18n_cache.rb +22 -0
  36. data/lib/simple_form/inputs.rb +21 -0
  37. data/lib/simple_form/inputs/base.rb +162 -0
  38. data/lib/simple_form/inputs/block_input.rb +14 -0
  39. data/lib/simple_form/inputs/boolean_input.rb +64 -0
  40. data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
  41. data/lib/simple_form/inputs/collection_input.rb +101 -0
  42. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +63 -0
  43. data/lib/simple_form/inputs/collection_select_input.rb +14 -0
  44. data/lib/simple_form/inputs/date_time_input.rb +28 -0
  45. data/lib/simple_form/inputs/file_input.rb +9 -0
  46. data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
  47. data/lib/simple_form/inputs/hidden_input.rb +17 -0
  48. data/lib/simple_form/inputs/numeric_input.rb +24 -0
  49. data/lib/simple_form/inputs/password_input.rb +12 -0
  50. data/lib/simple_form/inputs/priority_input.rb +24 -0
  51. data/lib/simple_form/inputs/range_input.rb +14 -0
  52. data/lib/simple_form/inputs/string_input.rb +23 -0
  53. data/lib/simple_form/inputs/text_input.rb +11 -0
  54. data/lib/simple_form/map_type.rb +16 -0
  55. data/lib/simple_form/version.rb +3 -0
  56. data/lib/simple_form/wrappers.rb +8 -0
  57. data/lib/simple_form/wrappers/builder.rb +103 -0
  58. data/lib/simple_form/wrappers/many.rb +69 -0
  59. data/lib/simple_form/wrappers/root.rb +34 -0
  60. data/lib/simple_form/wrappers/single.rb +18 -0
  61. data/test/action_view_extensions/builder_test.rb +577 -0
  62. data/test/action_view_extensions/form_helper_test.rb +104 -0
  63. data/test/components/label_test.rb +310 -0
  64. data/test/form_builder/association_test.rb +177 -0
  65. data/test/form_builder/button_test.rb +47 -0
  66. data/test/form_builder/error_notification_test.rb +79 -0
  67. data/test/form_builder/error_test.rb +121 -0
  68. data/test/form_builder/general_test.rb +356 -0
  69. data/test/form_builder/hint_test.rb +139 -0
  70. data/test/form_builder/input_field_test.rb +63 -0
  71. data/test/form_builder/label_test.rb +71 -0
  72. data/test/form_builder/wrapper_test.rb +149 -0
  73. data/test/generators/simple_form_generator_test.rb +32 -0
  74. data/test/inputs/boolean_input_test.rb +108 -0
  75. data/test/inputs/collection_check_boxes_input_test.rb +224 -0
  76. data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
  77. data/test/inputs/collection_select_input_test.rb +241 -0
  78. data/test/inputs/datetime_input_test.rb +99 -0
  79. data/test/inputs/disabled_test.rb +38 -0
  80. data/test/inputs/discovery_test.rb +61 -0
  81. data/test/inputs/file_input_test.rb +16 -0
  82. data/test/inputs/general_test.rb +69 -0
  83. data/test/inputs/grouped_collection_select_input_test.rb +118 -0
  84. data/test/inputs/hidden_input_test.rb +30 -0
  85. data/test/inputs/numeric_input_test.rb +173 -0
  86. data/test/inputs/priority_input_test.rb +43 -0
  87. data/test/inputs/readonly_test.rb +61 -0
  88. data/test/inputs/required_test.rb +113 -0
  89. data/test/inputs/string_input_test.rb +140 -0
  90. data/test/inputs/text_input_test.rb +24 -0
  91. data/test/simple_form_test.rb +9 -0
  92. data/test/support/discovery_inputs.rb +21 -0
  93. data/test/support/misc_helpers.rb +102 -0
  94. data/test/support/mock_controller.rb +24 -0
  95. data/test/support/models.rb +210 -0
  96. data/test/test_helper.rb +90 -0
  97. metadata +210 -0
@@ -0,0 +1,257 @@
1
+ ## 2.0.2 (Not released yet)
2
+
3
+ ### enhancements
4
+ * Add `:inline_label` configuration to nested booleans to display text inline with checkbox. ([@ehoch](https://github.com/ehoch))
5
+ * Add html support for hints ([@findrails](https://github.com/findrails))
6
+
7
+ ### bug fix
8
+ * Fix `min_max` component to not output maximum value. ([@julian7](https://github.com/julian7)).
9
+ Closes [#483](https://github.com/plataformatec/simple_form/issues/483)
10
+ * Remove leading and trailing whitespace from `label_text`
11
+ Closes [#492](https://github.com/plataformatec/simple_form/issues/492)
12
+ * Fix checked radio button issue when value is false ([@georgehemmings](https://github.com/georgehemmings)).
13
+
14
+ ## 2.0.1
15
+
16
+ ### bug fix
17
+ * Sanitaze html attributes to `label` method. ([@nashby](https://github.com/nashby)).
18
+ Closes [#472](https://github.com/plataformatec/simple_form/issues/472)
19
+ * Make `collection_check_boxes` and `collection_radio_buttons` work with local variables.
20
+ Closes [#474](https://github.com/plataformatec/simple_form/issues/474)
21
+ * Use `html5` component by default in the bootstrap generator. ([@isc](https://github.com/isc)).
22
+ Closes [#471](https://github.com/plataformatec/simple_form/issues/471)
23
+
24
+ ## 2.0.0
25
+
26
+ ### enhancements
27
+ * Add `button_class` configuration to change the class of buttons. ([@sryche](https://github.com/sryche))
28
+ * Add `disabled` class to a disabled input.
29
+ * Generate configuration file with `browser_validations` disabled.
30
+ * Add option and configuration to specify the collection wrapper class. ([@mfila](https://github.com/mfila))
31
+ * Add proc support to `collection` option. ([@jeffkreeftmeijer](https://github.com/jeffkreeftmeijer))
32
+ * `simple_form_for` allows default options for its inputs `:defaults => {}`.
33
+ * Add `readonly` as option of input method. ([@Untainted123](https://github.com/Untainted123))
34
+ * `simple_fields_for` for inherits wrapper option form the form builder. ([@nashby](https://github.com/nashby))
35
+ * Use action prefix in the form css class. Closes [#360](https://github.com/plataformatec/simple_form/issues/360).
36
+ This is not backward compatible with the previous versions of SimpleForm.
37
+ For more informations see [this comment](https://github.com/plataformatec/simple_form/issues/360#issuecomment-3000780).
38
+ ([@nashby](https://github.com/nashby))
39
+ * Add a readonly component that does automatically readonly lookup from object
40
+ * Add support for proc or lambda as option for format validator ([@nashby](https://github.com/nashby))
41
+ * Handle validates_length_of :is option in maxlength ([@nashby](https://github.com/nashby))
42
+ * Add field_with_hint css class to the wrapper when the input has a hint, similar to field_with_errors ([@nashby](https://github.com/nashby))
43
+ * Add :grouped_select input type, mapping to Rails grouped_collection_select helper ([@semaperepelitsa](https://github.com/semaperepelitsa))
44
+ * Add automatic translation of options for collection inputs given a collection of symbols ([@klobuczek](https://github.com/klobuczek))
45
+ * Add `:boolean_style` config to change how check boxes and radios will be displayed.
46
+ Options are `:inline = input + label` (default) and `:nested = label > input`.
47
+ * Add possibility to give a block to `collection_radio` and `collection_check_boxes`,
48
+ yielding a custom builder to generate custom label and input structure. It
49
+ is used internally with the :nested option for `:boolean_style`, and is useful
50
+ to allow some more customization if required.
51
+ * Do not generate hidden check box field when using nested boolean style, as it is considered
52
+ invalid markup in HTML5. This will work by default in Rails > 3.2.1 (not released at this time),
53
+ and is backported inside SimpleForm builder extensions.
54
+ More info in [#215](https://github.com/plataformatec/simple_form/issues/215)
55
+ * Add `item_wrapper_class` configuration option for collection radio buttons / check boxes inputs.
56
+ * Change default generator templates to use .form-inputs and .form-actions classes in wrapper divs.
57
+ (the latter is the default in bootstrap, so this makes it easier to integrate).
58
+ * Field error now accepts HTML tags ([@edison](https://github.com/edison))
59
+ * Add `generate_additional_classes_for` config option to selectively disable extra
60
+ css classes for components - wrapper, label and input. ([krzyzak](https://github.com/krzyzak))
61
+
62
+ ### deprecation
63
+ * Deprecate part of the old configuration API in favor of the wrapper API which allows you to customize your inputs
64
+ in a more flexible way. See [this guide](https://github.com/plataformatec/simple_form/wiki/Upgrading-to-Simple-Form-2.0)
65
+ to know how upgrade.
66
+ * Deprecate the `translate` configuration in favor of `translate_labels`
67
+ * Deprecate the `html5` configuration in favor of a new `html5` component
68
+ * Deprecate `:radio` input type in favor of `:radio_buttons`
69
+ * Deprecate `collection_radio` form helper in favor of `collection_radio_buttons`
70
+ (the label class has changed as well)
71
+ * Remove `error_notification_id` configuration
72
+
73
+ ### bug fix
74
+ * Fix i18n lookup with attributes with same name of models.
75
+ Closes [#149](https://github.com/plataformatec/simple_form/issues/149)
76
+ and [#364](https://github.com/plataformatec/simple_form/issues/364).
77
+ ([@nashby](https://github.com/nashby) and [@MarceloCajueiro](https://github.com/MarceloCajueiro))
78
+ * Do not generate `for` attribute for the collection label when it is a checkbox or radio.
79
+ Closes [#344](https://github.com/plataformatec/simple_form/issues/344).
80
+ ([@nashby](https://github.com/nashby) and [@mfila](https://github.com/mfila))
81
+ * Select can have required option when the `:include_blank` option is passed.
82
+ Closes [#340](https://github.com/plataformatec/simple_form/issues/340). ([@nashby](https://github.com/nashby))
83
+ * `:checked` option should override the existing associations on `collection_check_boxes`.
84
+ Closes [#341](https://github.com/plataformatec/simple_form/issues/341). ([@nashby](https://github.com/nashby))
85
+ * Move default attribute translations out of root - use "defaults" key instead
86
+ Closes [#384](https://github.com/plataformatec/simple_form/issues/384). ([@fringd](https://github.com/fringd))
87
+ * Fix label to datetime inputs to point to first select. ([@georgehemmings](https://github.com/georgehemmings))
88
+ * Fix usage of f.button :button with Rails 3.2.
89
+ Closes [#449](https://github.com/plataformatec/simple_form/issues/449).
90
+
91
+ ## 1.5.2
92
+
93
+ ### bug fix
94
+ * Remove the internal usage of deprecated `:components`
95
+
96
+ ## 1.5.1
97
+
98
+ ### deprecation
99
+ * `:components` options is now deprecated
100
+
101
+ ### bug fix
102
+ * Fallback to default label when block is provided. ([@pivotal-casebook](https://github.com/pivotal-casebook))
103
+ * Do not override default selection through attribute value in collection select when label/value methods are lambdas.
104
+
105
+ ## 1.5.0
106
+
107
+ ### enhancements
108
+ * Simplified generator by using directory action. ([@rupert654](https://github.com/rupert654))
109
+ * Support for `maxlength` on string inputs inferred from validation. ([@srbartlett](https://github.com/srbartlett))
110
+ * Change form css class handling to only add the dom class when one is not given to the form call.
111
+ ([@patrick99e99](https://github.com/patrick99e99))
112
+ * Support for required attributes when action validations are present. ([@csegura](http://github.com/csegura))
113
+ * Do not generate `size` attribute for numeric input. ([@csegura](https://github.com/jasonmp85))
114
+ * Support for `maxlength` on text area inputs inferred from validation.
115
+ * Support for `pattern` on text field inferred from validation when `:pattern` is true.
116
+ * Break Text, Password and File into their own inputs.
117
+ * Support easy enabling and disabling of components for specific inputs.
118
+ * Add HTML5 range input.
119
+
120
+ ### bug fix
121
+ * Fix bug when `simple_fields_for` is used with a hash like models and Rails 3.1.
122
+ * Fix bug that does not remove the `:item_wrapper_tag` or the `:collection_wrapper_tag` on collection
123
+ inputs when nil or false value is passed to these options. ([@dw2](https://gitbub.com/dw2))
124
+ * Fix bug that disable the entire select and wrapper when `disabled` option is a string or array.
125
+ * Fix bug when using label/value methods as procs together with disabled/selected options as procs for select inputs.
126
+
127
+ ## 1.4.2
128
+
129
+ ### enhancements
130
+ * Rails 3.1 support.
131
+
132
+ ## 1.4.1
133
+
134
+ ### enhancements
135
+ * ignore required attribute when conditional validations are present.
136
+
137
+ ### bug fix
138
+ * Do not use `required='required'` when browser validations are turned off.
139
+ * Sanitize HMTL attributes in error and hint helpers when options are present.
140
+ * Improve i18n lookup by ignoring explicit child index given to form builder.
141
+ (tests by [@rywall](https://github.com/rywall))
142
+ * Fixes the form specific validation option if specified on the form itself. ([@medihack](https://github.com/medihack))
143
+
144
+ ## 1.4.0
145
+
146
+ ### enhancements
147
+ * Add label class configuration option. ([@reu](http://github.com/reu))
148
+ * Improve i18n lookup (labels/hints/placeholders) for nested models.
149
+ * Use the given custom builder with `simple_fields_for`. ([@giniedp](https://github.com/giniedp))
150
+ * Add slim form generator. ([@fagiani](https://github.com/fagiani))
151
+ * Add `form_class` configuration option. ([@fagiani](https://github.com/fagiani))
152
+ * Default step of `any` for number input with non integer attributes. ([@fedesoria](https://github.com/fedesoria))
153
+ * Add option to disable HTML5 browser validations on all forms. ([@coryschires](https://github.com/coryschires))
154
+ * Add option to disable all HTML5 extensions. ([@wolframarnold](https://github.com/wolframarnold))
155
+ * Add `input_field` helper to form builder. ([@jeroenhouben](https://github.com/jeroenhouben))
156
+ * Allow inputs to be discovered on demand by placing them at app/inputs (a la formtastic).
157
+ * Add `full_error` on that shows the error with the attribute name.
158
+
159
+ ### bug fix
160
+ * Fix for file attributes automatic detection, to work with virtual attributes.
161
+ * Fix for numeric fields validation options using symbols and procs.
162
+ * Fix password attributes to add `size` and `maxlength` options the same way as string. ([@fedesoria](https://github.com/fedesoria))
163
+ * Fix bug with custom form builders and new mappings being added to the superclass builder. ([@rdvdijk](https://github.com/rdvdijk))
164
+ * Fix HTML validation issue with `collection_check_boxes`.
165
+
166
+ ## 1.3.1
167
+
168
+ ### enhancements
169
+ * Add `:autofocus` HTML5 attribute support. ([@jpzwarte](https://github.com/jpzwarte))
170
+ * Add possibility to specify custom builder and inherit mappings. ([@rejeep](https://github.com/rejeep))
171
+ * Make custom mappings work with all attributes types. ([@rafaelfranca](https://github.com/rafaelfranca))
172
+ * Add support for procs/lambdas in text/value methods for `collection_select`.
173
+
174
+ ### deprecation
175
+ * removed the deprecated `:remote_form_for`
176
+
177
+ ### bug fix
178
+ * Only add the `required` HTML 5 attribute for valid inputs, disable in selects (not allowed).
179
+ * Fix error when using hints without an attribute.
180
+ ([@butsjoh](https://github.com/butsjoh) and [@rafaelfranca](https://github.com/rafaelfranca))
181
+ * Fix messy html output for hint, error and label components.
182
+ ([@butsjoh](https://github.com/butsjoh) and [@rafaelfranca](https://github.com/rafaelfranca))
183
+ * Allow direct setting of for attribute on label. ([@Bertg](https://github.com/Bertg))
184
+
185
+ ## 1.3.0
186
+
187
+ ### enhancements
188
+ * Allow collection input to accept a collection of symbols.
189
+ * Add default css class to button.
190
+ * Allow forms for objects that do not respond to the `errors` method.
191
+ * `collection_check_boxes` and `collection_radio` now wrap the input in the label.
192
+ * Automatic add min/max values for numeric attributes based on validations and step for integers - HTML5.
193
+ ([@dasch](https://github.com/dasch))
194
+ * Add `:placeholder` option for string inputs, allowing customization through I18n - HTML5.
195
+ ([@jonathan](https://github.com/jonathan))
196
+ * Add `:search` and `:tel` input types, with `:tel` mapping automatically from attributes matching "phone" - HTML5.
197
+ * Add `:required` html attribute for required inputs - HTML5.
198
+ * Add optional `:components` option to input to control component rendering. ([@khoan](https://github.com/khoan))
199
+ * Add `SimpleForm.translate` as an easy way to turn off SimpleForm internal translations.
200
+ * Add `:disabled` option for all inputs. ([@fabiob](https://github.com/fabiob))
201
+ * Add collection wrapper tag and item wrapper tag to wrap elements in collection helpers - radio / check boxes.
202
+ * Add `SimpleForm.input_mappings` to allow configuring custom mappings for inputs. ([@TMaYaD](https://github.com/TMaYaD))
203
+
204
+ ### bug fix
205
+ * Search for validations on both association and attribute.
206
+ * Use `controller.action_name` to lookup action only when available, to fix issue with Rspec views tests.
207
+ ([@rafaelfranca](https://github.com/rafaelfranca))
208
+
209
+ ## 1.2.2
210
+
211
+ ### enhancements
212
+ * Compatibility with Rails 3 RC.
213
+
214
+ ## 1.2.1
215
+
216
+ ### enhancements
217
+ * Added haml generator support. ([@grimen](https://github.com/grimen))
218
+ * Added `error_notification` message to form builder.
219
+ * Added required by default as configuration option.
220
+ * Added `label_input` as component, allowing boolean to change its order (input appearing first than label).
221
+ * Added `error_method` to tidy up how errors are exhibited.
222
+ * Added error class on wrappers. ([@jduff](https://github.com/jduff))
223
+ * Changed numeric types to have `type=number` for HTML5.
224
+
225
+ ## 1.2.0
226
+
227
+ ### deprecation
228
+ * Changed `simple_form_install` generator to `simple_form:install`.
229
+
230
+ ### enhancements
231
+ * Added support to presence validation to check if attribute is required or not. ([@gcirne](https://github.com/gcirne))
232
+ * Added `input` as class to wrapper tag.
233
+ * Added config options for hint and error tags. ([@tjogin](https://github.com/tjogin))
234
+
235
+ ## 1.1.3
236
+
237
+ ### deprecation
238
+ * removed `:conditions`, `:order`, `:joins` and `:include` support in `f.association`.
239
+
240
+ ## 1.1.2
241
+
242
+ ### bug fix
243
+ * Ensure type is set to "text" and not "string".
244
+
245
+ ## 1.1.1
246
+
247
+ ### bug fix
248
+ * Fix some escaping issues.
249
+
250
+ ## 1.1.0
251
+
252
+ ### enhancements
253
+ * Rails 3 support with generators, templates and HTML 5.
254
+
255
+ ## 1.0
256
+
257
+ * First release.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 PlataformaTec http://blog.plataformatec.com.br/
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,797 @@
1
+ # SimpleForm - Rails forms made easy.
2
+ [![Build Status](https://secure.travis-ci.org/plataformatec/simple_form.png)](http://travis-ci.org/plataformatec/simple_form)
3
+
4
+ **SimpleForm** aims to be as flexible as possible while helping you with powerful components to create
5
+ your forms. The basic goal of SimpleForm is to not touch your way of defining the layout, letting
6
+ you find the better design for your eyes. Most of the DSL was inherited from Formtastic,
7
+ which we are thankful for and should make you feel right at home.
8
+
9
+ INFO: This README is [also available in a friendly navigable format](http://simple-form.plataformatec.com.br/)
10
+ and refers to **SimpleForm** 2.0. If you are using **SimpleForm** in the versions 1.x, you should
11
+ check this branch:
12
+
13
+ https://github.com/plataformatec/simple_form/tree/v1.5
14
+
15
+ ## Installation
16
+
17
+ Add it to your Gemfile:
18
+
19
+ `gem 'simple_form'`
20
+
21
+ Run the following command to install it:
22
+
23
+ `bundle install`
24
+
25
+ Run the generator:
26
+
27
+ `rails generate simple_form:install`
28
+
29
+ Also, if you want to use the country select, you will need the
30
+ [country_select gem](https://rubygems.org/gems/country_select), add it to your Gemfile:
31
+
32
+ `gem 'country_select'`
33
+
34
+ ### Twitter Bootstrap
35
+
36
+ **SimpleForm** 2.0 can be easily integrated to the [Twitter Bootstrap](http://twitter.github.com/bootstrap).
37
+ To do that you have to use the `bootstrap` option in the install generator, like this:
38
+
39
+ `rails generate simple_form:install --bootstrap`
40
+
41
+ You have to be sure that you added a copy of the [Twitter Bootstrap](http://twitter.github.com/bootstrap)
42
+ assets on your application.
43
+
44
+ For more information see the generator output, our
45
+ [example application code](https://github.com/rafaelfranca/simple_form-bootstrap) and
46
+ [the live example app](http://simple-form-bootstrap.plataformatec.com.br/).
47
+
48
+ **NOTE**: **SimpleForm** integration requires Twitter Bootstrap version 2.0 or higher.
49
+
50
+ ## Usage
51
+
52
+ **SimpleForm** was designed to be customized as you need to. Basically it's a stack of components that
53
+ are invoked to create a complete html input for you, which by default contains label, hints, errors
54
+ and the input itself. It does not aim to create a lot of different logic from the default Rails
55
+ form helpers, as they do a great work by themselves. Instead, **SimpleForm** acts as a DSL and just
56
+ maps your input type (retrieved from the column definition in the database) to an specific helper method.
57
+
58
+ To start using **SimpleForm** you just have to use the helper it provides:
59
+
60
+ ```erb
61
+ <%= simple_form_for @user do |f| %>
62
+ <%= f.input :username %>
63
+ <%= f.input :password %>
64
+ <%= f.button :submit %>
65
+ <% end %>
66
+ ```
67
+
68
+ This will generate an entire form with labels for user name and password as well, and render errors
69
+ by default when you render the form with invalid data (after submitting for example).
70
+
71
+ You can overwrite the default label by passing it to the input method. You can also add a hint or
72
+ even a placeholder:
73
+
74
+ ```erb
75
+ <%= simple_form_for @user do |f| %>
76
+ <%= f.input :username, :label => 'Your username please' %>
77
+ <%= f.input :password, :hint => 'No special characters.' %>
78
+ <%= f.input :email, :placeholder => 'user@domain.com' %>
79
+ <%= f.button :submit %>
80
+ <% end %>
81
+ ```
82
+
83
+ In some cases you may want to disable labels, hints or error. Or you may want to configure the html
84
+ of any of them:
85
+
86
+ ```erb
87
+ <%= simple_form_for @user do |f| %>
88
+ <%= f.input :username, :label_html => { :class => 'my_class' } %>
89
+ <%= f.input :password, :hint => false, :error_html => { :id => 'password_error'} %>
90
+ <%= f.input :password_confirmation, :label => false %>
91
+ <%= f.button :submit %>
92
+ <% end %>
93
+ ```
94
+
95
+ It is also possible to pass any html attribute straight to the input, by using the `:input_html`
96
+ option, for instance:
97
+
98
+ ```erb
99
+ <%= simple_form_for @user do |f| %>
100
+ <%= f.input :username, :input_html => { :class => 'special' } %>
101
+ <%= f.input :password, :input_html => { :maxlength => 20 } %>
102
+ <%= f.input :remember_me, :input_html => { :value => '1' } %>
103
+ <%= f.button :submit %>
104
+ <% end %>
105
+ ```
106
+
107
+ If you want to pass the same options to all inputs in the form (for example, a default class),
108
+ you can use the `:defaults` option in `simple_form_for`. Specific options in `input` call will
109
+ overwrite the defaults:
110
+
111
+ ```erb
112
+ <%= simple_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f| %>
113
+ <%= f.input :username, :input_html => { :class => 'special' } %>
114
+ <%= f.input :password, :input_html => { :maxlength => 20 } %>
115
+ <%= f.input :remember_me, :input_html => { :value => '1' } %>
116
+ <%= f.button :submit %>
117
+ <% end %>
118
+ ```
119
+
120
+ Since **SimpleForm** generates a wrapper div around your label and input by default, you can pass
121
+ any html attribute to that wrapper as well using the `:wrapper_html` option, like so:
122
+
123
+ ```erb
124
+ <%= simple_form_for @user do |f| %>
125
+ <%= f.input :username, :wrapper_html => { :class => 'username' } %>
126
+ <%= f.input :password, :wrapper_html => { :id => 'password' } %>
127
+ <%= f.input :remember_me, :wrapper_html => { :class => 'options' } %>
128
+ <%= f.button :submit %>
129
+ <% end %>
130
+ ```
131
+
132
+ By default all inputs are required, which means an * is prepended to the label, but you can disable
133
+ it in any input you want:
134
+
135
+ ```erb
136
+ <%= simple_form_for @user do |f| %>
137
+ <%= f.input :name, :required => false %>
138
+ <%= f.input :username %>
139
+ <%= f.input :password %>
140
+ <%= f.button :submit %>
141
+ <% end %>
142
+ ```
143
+
144
+ **SimpleForm** also lets you overwrite the default input type it creates:
145
+
146
+ ```erb
147
+ <%= simple_form_for @user do |f| %>
148
+ <%= f.input :username %>
149
+ <%= f.input :password %>
150
+ <%= f.input :description, :as => :text %>
151
+ <%= f.input :accepts, :as => :radio_buttons %>
152
+ <%= f.button :submit %>
153
+ <% end %>
154
+ ```
155
+
156
+ So instead of a checkbox for the *accepts* attribute, you'll have a pair of radio buttons with yes/no
157
+ labels and a text area instead of a text field for the description. You can also render boolean
158
+ attributes using `:as => :select` to show a dropdown.
159
+
160
+ It is also possible to give the `:disabled` option to **SimpleForm**, and it'll automatically mark
161
+ the wrapper as disabled with a css class, so you can style labels, hints and other components inside
162
+ the wrapper as well:
163
+
164
+ ```erb
165
+ <%= simple_form_for @user do |f| %>
166
+ <%= f.input :username, :disabled => true, :hint => 'You cannot change your username.' %>
167
+ <%= f.button :submit %>
168
+ <% end %>
169
+ ```
170
+
171
+ **SimpleForm** accepts same options as their corresponding input type helper in Rails:
172
+
173
+ ```erb
174
+ <%= simple_form_for @user do |f| %>
175
+ <%= f.input :date_of_birth, :as => :date, :start_year => Date.today.year - 90,
176
+ :end_year => Date.today.year - 12, :discard_day => true,
177
+ :order => [:month, :year] %>
178
+ <%= f.button :submit %>
179
+ <% end %>
180
+ ```
181
+
182
+ **SimpleForm** also allows you to use label, hint, input_field, error and full_error helpers
183
+ (please take a look at the rdocs for each method for more info):
184
+
185
+ ```erb
186
+ <%= simple_form_for @user do |f| %>
187
+ <%= f.label :username %>
188
+ <%= f.input_field :username %>
189
+ <%= f.hint 'No special characters, please!' %>
190
+ <%= f.error :username, :id => 'user_name_error' %>
191
+ <%= f.full_error :token %>
192
+ <%= f.submit 'Save' %>
193
+ <% end %>
194
+ ```
195
+
196
+ Any extra option passed to these methods will be rendered as html option.
197
+
198
+ ### Collections
199
+
200
+ And what if you want to create a select containing the age from 18 to 60 in your form? You can do it
201
+ overriding the `:collection` option:
202
+
203
+ ```erb
204
+ <%= simple_form_for @user do |f| %>
205
+ <%= f.input :user %>
206
+ <%= f.input :age, :collection => 18..60 %>
207
+ <%= f.button :submit %>
208
+ <% end %>
209
+ ```
210
+
211
+ Collections can be arrays or ranges, and when a `:collection` is given the `:select` input will be
212
+ rendered by default, so we don't need to pass the `:as => :select` option. Other types of collection
213
+ are `:radio_buttons` and `:check_boxes`. Those are added by **SimpleForm** to Rails set of form
214
+ helpers (read Extra Helpers session below for more information).
215
+
216
+ Collection inputs accept two other options beside collections:
217
+
218
+ * _label_method_ => the label method to be applied to the collection to retrieve the label (use this
219
+ instead of the `text_method` option in `collection_select`)
220
+
221
+ * _value_method_ => the value method to be applied to the collection to retrieve the value
222
+
223
+ Those methods are useful to manipulate the given collection. Both of these options also accept
224
+ lambda/procs in case you want to calculate the value or label in a special way eg. custom
225
+ translation. All other options given are sent straight to the underlying helper. For example, you
226
+ can give prompt as:
227
+
228
+ ```ruby
229
+ f.input :age, :collection => 18..60, :prompt => "Select your age"
230
+ ```
231
+
232
+ It is also possible to create grouped collection selects, that will use the html *optgroup* tags, like this:
233
+
234
+ ```ruby
235
+ f.input :country_id, :collection => @continents, :as => :grouped_select, :group_method => :countries
236
+ ```
237
+
238
+ Grouped collection inputs accept the same `:label_method` and `:value_method` options, which will be
239
+ used to retrieve label/value attributes for the `option` tags. Besides that, you can give:
240
+
241
+ * _group_method_ => the method to be called on the given collection to generate the options for
242
+ each group (required)
243
+
244
+ * _group_label_method_ => the label method to be applied on the given collection to retrieve the label
245
+ for the _optgroup_ (**SimpleForm** will attempt to guess the best one the same way it does with
246
+ `:label_method`)
247
+
248
+ ### Priority
249
+
250
+ **SimpleForm** also supports `:time_zone` and `:country`. When using such helpers, you can give
251
+ `:priority` as option to select which time zones and/or countries should be given higher priority:
252
+
253
+ ```ruby
254
+ f.input :residence_country, :priority => [ "Brazil" ]
255
+ f.input :time_zone, :priority => /US/
256
+ ```
257
+
258
+ Those values can also be configured with a default value to be used site use through the
259
+ `SimpleForm.country_priority` and `SimpleForm.time_zone_priority` helpers.
260
+
261
+ Note: While using `country_select` if you want to restrict to only a subset of countries for a specific
262
+ drop down then you may use the `:collection` option:
263
+
264
+ ```ruby
265
+ f.input :shipping_country, :priority => [ "Brazil" ], :collection => [ "Australia", "Brazil", "New Zealand"]
266
+ ```
267
+
268
+ ### Associations
269
+
270
+ To deal with associations, **SimpleForm** can generate select inputs, a series of radios buttons or check boxes.
271
+ Lets see how it works: imagine you have a user model that belongs to a company and has_and_belongs_to_many
272
+ roles. The structure would be something like:
273
+
274
+ ```ruby
275
+ class User < ActiveRecord::Base
276
+ belongs_to :company
277
+ has_and_belongs_to_many :roles
278
+ end
279
+
280
+ class Company < ActiveRecord::Base
281
+ has_many :users
282
+ end
283
+
284
+ class Role < ActiveRecord::Base
285
+ has_and_belongs_to_many :users
286
+ end
287
+ ```
288
+
289
+ Now we have the user form:
290
+
291
+ ```erb
292
+ <%= simple_form_for @user do |f| %>
293
+ <%= f.input :name %>
294
+ <%= f.association :company %>
295
+ <%= f.association :roles %>
296
+ <%= f.button :submit %>
297
+ <% end %>
298
+ ```
299
+
300
+ Simple enough, right? This is going to render a `:select` input for choosing the `:company`, and another
301
+ `:select` input with `:multiple` option for the `:roles`. You can, of course, change it to use radio
302
+ buttons and check boxes as well:
303
+
304
+ ```ruby
305
+ f.association :company, :as => :radio_buttons
306
+ f.association :roles, :as => :check_boxes
307
+ ```
308
+
309
+ The association helper just invokes `input` under the hood, so all options available to `:select`,
310
+ `:radio_buttons` and `:check_boxes` are also available to association. Additionally, you can specify
311
+ the collection by hand, all together with the prompt:
312
+
313
+ ```ruby
314
+ f.association :company, :collection => Company.active.all(:order => 'name'), :prompt => "Choose a Company"
315
+ ```
316
+
317
+ ### Buttons
318
+
319
+ All web forms need buttons, right? **SimpleForm** wraps them in the DSL, acting like a proxy:
320
+
321
+ ```erb
322
+ <%= simple_form_for @user do |f| %>
323
+ <%= f.input :name %>
324
+ <%= f.button :submit %>
325
+ <% end %>
326
+ ```
327
+
328
+ The above will simply call submit. You choose to use it or not, it's just a question of taste.
329
+
330
+ ### Wrapping Rails Form Helpers
331
+
332
+ Say you wanted to use a rails form helper but still wrap it in **SimpleForm** goodness? You can, by
333
+ calling input with a block like so:
334
+
335
+ ```erb
336
+ <%= f.input :role do %>
337
+ <%= f.select :role, Role.all.map { |r| [r.name, r.id, { :class => r.company.id }] }, :include_blank => true %>
338
+ <% end %>
339
+ ```
340
+
341
+ In the above example, we're taking advantage of Rails 3's select method that allows us to pass in a
342
+ hash of additional attributes for each option.
343
+
344
+ ### Extra helpers
345
+
346
+ **SimpleForm** also comes with some extra helpers you can use inside rails default forms without relying
347
+ on `simple_form_for` helper. They are listed below.
348
+
349
+ #### Simple Fields For
350
+
351
+ Wrapper to use SimpleForm inside a default rails form
352
+
353
+ ```ruby
354
+ form_for @user do |f|
355
+ f.simple_fields_for :posts do |posts_form|
356
+ # Here you have all simple_form methods available
357
+ posts_form.input :title
358
+ end
359
+ end
360
+ ```
361
+
362
+ #### Collection Radio Buttons
363
+
364
+ Creates a collection of radio inputs with labels associated (same API as `collection_select`):
365
+
366
+ ```ruby
367
+ form_for @user do |f|
368
+ f.collection_radio_buttons :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
369
+ end
370
+ ```
371
+
372
+ ```html
373
+ <input id="user_options_true" name="user[options]" type="radio" value="true" />
374
+ <label class="collection_radio_buttons" for="user_options_true">Yes</label>
375
+ <input id="user_options_false" name="user[options]" type="radio" value="false" />
376
+ <label class="collection_radio_buttons" for="user_options_false">No</label>
377
+ ```
378
+
379
+ #### Collection Check Boxes
380
+
381
+ Creates a collection of check boxes with labels associated (same API as `collection_select`):
382
+
383
+ ```ruby
384
+ form_for @user do |f|
385
+ f.collection_check_boxes :options, [[true, 'Yes'] ,[false, 'No']], :first, :last
386
+ end
387
+ ```
388
+
389
+ ```html
390
+ <input name="user[options][]" type="hidden" value="" />
391
+ <input id="user_options_true" name="user[options][]" type="checkbox" value="true" />
392
+ <label class="collection_check_box" for="user_options_true">Yes</label>
393
+ <input name="user[options][]" type="hidden" value="" />
394
+ <input id="user_options_false" name="user[options][]" type="checkbox" value="false" />
395
+ <label class="collection_check_box" for="user_options_false">No</label>
396
+ ```
397
+
398
+ To use this with associations in your model, you can do the following:
399
+
400
+ ```ruby
401
+ form_for @user do |f|
402
+ f.collection_check_boxes :role_ids, Role.all, :id, :name # using :roles here is not going to work.
403
+ end
404
+ ```
405
+
406
+ ## Mappings/Inputs available
407
+
408
+ **SimpleForm** comes with a lot of default mappings:
409
+
410
+ ```text
411
+ Mapping Input Column Type
412
+
413
+ boolean check box boolean
414
+ string text field string
415
+ email email field string with name matching "email"
416
+ url url field string with name matching "url"
417
+ tel tel field string with name matching "phone"
418
+ password password field string with name matching "password"
419
+ search search -
420
+ text text area text
421
+ file file field string, responding to file methods
422
+ hidden hidden field -
423
+ integer number field integer
424
+ float number field float
425
+ decimal number field decimal
426
+ range range field -
427
+ datetime datetime select datetime/timestamp
428
+ date date select date
429
+ time time select time
430
+ select collection select belongs_to/has_many/has_and_belongs_to_many associations
431
+ radio_buttons collection radio buttons belongs_to
432
+ check_boxes collection check boxes has_many/has_and_belongs_to_many associations
433
+ country country select string with name matching "country"
434
+ time_zone time zone select string with name matching "time_zone"
435
+ ```
436
+
437
+ ## Custom inputs
438
+
439
+ It is very easy to add custom inputs to **SimpleForm**. For instance, if you want to add a custom input
440
+ that extends the string one, you just need to add this file:
441
+
442
+ ```ruby
443
+ # app/inputs/currency_input.rb
444
+ class CurrencyInput < SimpleForm::Inputs::Base
445
+ def input
446
+ "$ #{@builder.text_field(attribute_name, input_html_options)}".html_safe
447
+ end
448
+ end
449
+ ```
450
+
451
+ And use it in your views:
452
+
453
+ ```ruby
454
+ f.input :money, :as => :currency
455
+ ```
456
+
457
+ You can also redefine existing **SimpleForm** inputs by creating a new class with the same name. For
458
+ instance, if you want to wrap date/time/datetime in a div, you can do:
459
+
460
+ ```ruby
461
+ # app/inputs/date_time_input.rb
462
+ class DateTimeInput < SimpleForm::Inputs::DateTimeInput
463
+ def input
464
+ "<div>#{super}</div>".html_safe
465
+ end
466
+ end
467
+ ```
468
+
469
+ ## Custom form builder
470
+
471
+ You can create a custom form builder that uses **SimpleForm**.
472
+
473
+ Create a helper method that calls `simple_form_for` with a custom builder:
474
+
475
+ ```ruby
476
+ def custom_form_for(object, *args, &block)
477
+ options = args.extract_options!
478
+ simple_form_for(object, *(args << options.merge(:builder => CustomFormBuilder)), &block)
479
+ end
480
+ ```
481
+
482
+ Create a form builder class that inherits from `SimpleForm::FormBuilder`.
483
+
484
+ ```ruby
485
+ class CustomFormBuilder < SimpleForm::FormBuilder
486
+ def input(attribute_name, options = {}, &block)
487
+ options[:input_html].merge! :class => 'custom'
488
+ super
489
+ end
490
+ end
491
+ ```
492
+
493
+ ## I18n
494
+
495
+ **SimpleForm** uses all power of I18n API to lookup labels, hints and placeholders. To customize your
496
+ forms you can create a locale file like this:
497
+
498
+ ```yaml
499
+ en:
500
+ simple_form:
501
+ labels:
502
+ user:
503
+ username: 'User name'
504
+ password: 'Password'
505
+ hints:
506
+ user:
507
+ username: 'User name to sign in.'
508
+ password: 'No special characters, please.'
509
+ placeholders:
510
+ user:
511
+ username: 'Your username'
512
+ password: '****'
513
+ ```
514
+
515
+ And your forms will use this information to render the components for you.
516
+
517
+ **SimpleForm** also lets you be more specific, separating lookups through actions for labels, hints and
518
+ placeholders. Let's say you want a different label for new and edit actions, the locale file would
519
+ be something like:
520
+
521
+ ```yaml
522
+ en:
523
+ simple_form:
524
+ labels:
525
+ user:
526
+ username: 'User name'
527
+ password: 'Password'
528
+ edit:
529
+ username: 'Change user name'
530
+ password: 'Change password'
531
+ ```
532
+
533
+ This way **SimpleForm** will figure out the right translation for you, based on the action being
534
+ rendered. And to be a little bit DRYer with your locale file, you can specify defaults for all
535
+ models under the 'defaults' key:
536
+
537
+ ```yaml
538
+ en:
539
+ simple_form:
540
+ labels:
541
+ defaults:
542
+ username: 'User name'
543
+ password: 'Password'
544
+ new:
545
+ username: 'Choose a user name'
546
+ hints:
547
+ defaults:
548
+ username: 'User name to sign in.'
549
+ password: 'No special characters, please.'
550
+ placeholders:
551
+ defaults:
552
+ username: 'Your username'
553
+ password: '****'
554
+ ```
555
+
556
+ **SimpleForm** will always look for a default attribute translation under the "defaults" key if no
557
+ specific is found inside the model key.Note that this syntax is different from 1.x. To migrate to
558
+ the new syntax, just move "labels.#{attribute}" to "labels.defaults.#{attribute}".
559
+
560
+ In addition, **SimpleForm** will fallback to default human_attribute_name from Rails when no other
561
+ translation is found for labels. Finally, you can also overwrite any label, hint or placeholder
562
+ inside your view, just by passing the option manually. This way the I18n lookup will be skipped.
563
+
564
+ **SimpleForm** also has support for translating options in collection helpers. For instance, given a
565
+ User with a `:gender` attribute, you might want to create a select box showing translated labels
566
+ that would post either `male` or `female` as value. With **SimpleForm** you could create an input
567
+ like this:
568
+
569
+ ```ruby
570
+ f.input :gender, :collection => [:male, :female]
571
+ ```
572
+
573
+ And **SimpleForm** will try a lookup like this in your locale file, to find the right labels to show:
574
+
575
+ ```yaml
576
+ en:
577
+ simple_form:
578
+ options:
579
+ user:
580
+ gender:
581
+ male: 'Male'
582
+ female: "Female'
583
+ ```
584
+
585
+ You can also use the `defaults` key as you would do with labels, hints and placeholders. It is
586
+ important to notice that **SimpleForm** will only do the lookup for options if you give a collection
587
+ composed of symbols only. This is to avoid constant lookups to I18n.
588
+
589
+ It's also possible to translate buttons, using Rails' built-in I18n support:
590
+
591
+ ```yaml
592
+ en:
593
+ helpers:
594
+ submit:
595
+ user:
596
+ create: "Add %{model}"
597
+ update: "Save Changes"
598
+ ```
599
+
600
+ There are other options that can be configured through I18n API, such as required text and boolean.
601
+ Be sure to check our locale file or the one copied to your application after you run
602
+ `rails generate simple_form:install`.
603
+
604
+ ## Configuration
605
+
606
+ **SimpleForm** has several configuration options. You can read and change them in the initializer
607
+ created by **SimpleForm**, so if you haven't executed the command below yet, please do:
608
+
609
+ `rails generate simple_form:install`
610
+
611
+ ### The wrappers API
612
+
613
+ With **SimpleForm** you can configure how your components will be rendered using the wrappers API.
614
+ The syntax looks like this:
615
+
616
+ ```ruby
617
+ config.wrappers :tag => :div, :class => :input,
618
+ :error_class => :field_with_errors do |b|
619
+
620
+ # Form extensions
621
+ b.use :html5
622
+ b.optional :pattern
623
+ b.use :maxlength
624
+ b.use :placeholder
625
+ b.use :readonly
626
+
627
+ # Form components
628
+ b.use :label_input
629
+ b.use :hint, :wrap_with => { :tag => :span, :class => :hint }
630
+ b.use :error, :wrap_with => { :tag => :span, :class => :error }
631
+ end
632
+ ```
633
+
634
+ The _Form components_ will generate the form tags like labels, inputs, hints or errors contents.
635
+
636
+ The _Form extensions_ are used to generate some attributes or perform some lookups on the model to
637
+ add extra information to your components.
638
+
639
+ You can create new _Form components_ using the wrappers API as in the following example:
640
+
641
+ ```ruby
642
+ config.wrappers do |b|
643
+ b.use :placeholder
644
+ b.use :label_input
645
+ b.wrapper :tag => :div, :class => 'separator' do |component|
646
+ component.use :hint, :wrap_with => { :tag => :span, :class => :hint }
647
+ component.use :error, :wrap_with => { :tag => :span, :class => :error }
648
+ end
649
+ end
650
+ ```
651
+
652
+ this will wrap the hint and error components within a `div` tag using the class `'separator'`.
653
+
654
+ If you want to customize the custom _Form components_ on demand you can give it a name like this:
655
+
656
+ ```ruby
657
+ config.wrappers do |b|
658
+ b.use :placeholder
659
+ b.use :label_input
660
+ b.wrapper :my_wrapper, :tag => :div, :class => 'separator' do |component|
661
+ component.use :hint, :wrap_with => { :tag => :span, :class => :hint }
662
+ component.use :error, :wrap_with => { :tag => :span, :class => :error }
663
+ end
664
+ end
665
+ ```
666
+
667
+ and now you can pass options to your `input` calls to customize the `:my_wrapper` _Form component_.
668
+
669
+ ```ruby
670
+ # Completely turns off the custom wrapper
671
+ f.input :name, :my_wrapper => false
672
+
673
+ # Configure the html
674
+ f.input :name, :my_wrapper_html => { :id => 'special_id' }
675
+
676
+ # Configure the tag
677
+ f.input :name, :my_wrapper_tag => :p
678
+ ```
679
+
680
+ You can also define more than one wrapper and pick one to render in a specific form or input.
681
+ To define another wrapper you have to give it a name, as the follow:
682
+
683
+ ```ruby
684
+ config.wrappers :small do |b|
685
+ b.use :placeholder
686
+ b.use :label_input
687
+ end
688
+ ```
689
+
690
+ and use it in this way:
691
+
692
+ ```ruby
693
+ # Specifying to whole form
694
+ simple_form_for @user, :wrapper => :small do |f|
695
+ f.input :name
696
+ end
697
+
698
+ # Specifying to one input
699
+ simple_form_for @user do |f|
700
+ f.input :name, :wrapper => :small
701
+ end
702
+ ```
703
+
704
+ **SimpleForm** also allows you to use optional elements. For instance, let's suppose you want to use
705
+ hints or placeholders, but you don't want them to be generated automatically. You can set their
706
+ default values to `false` or use the `optional` method. Is preferible to use the `optional` syntax:
707
+
708
+ ```ruby
709
+ config.wrappers :placeholder => false do |b|
710
+ b.use :placeholder
711
+ b.use :label_input
712
+ b.wrapper :tag => :div, :class => 'separator' do |component|
713
+ component.optional :hint, :wrap_with => { :tag => :span, :class => :hint }
714
+ component.use :error, :wrap_with => { :tag => :span, :class => :error }
715
+ end
716
+ end
717
+ ```
718
+
719
+ By setting it as `optional`, a hint will only be generated when `:hint => true` is explicitly used.
720
+ The same for placehold.
721
+
722
+ ## HTML 5 Notice
723
+
724
+ By default, **SimpleForm** will generate input field types and attributes that are supported in HTML5,
725
+ but are considered invalid HTML for older document types such as HTML4 or XHTML1.0. The HTML5
726
+ extensions include the new field types such as email, number, search, url, tel, and the new
727
+ attributes such as required, autofocus, maxlength, min, max, step.
728
+
729
+ Most browsers will not care, but some of the newer ones - in particular Chrome 10+ - use the
730
+ required attribute to force a value into an input and will prevent form submission without it.
731
+ Depending on the design of the application this may or may not be desired. In many cases it can
732
+ break existing UI's.
733
+
734
+ It is possible to disable all HTML 5 extensions in **SimpleForm** with the following configuration:
735
+
736
+ ```ruby
737
+ SimpleForm.html5 = false # default is true
738
+ ```
739
+
740
+ If you want to have all other HTML 5 features, such as the new field types, you can disable only
741
+ the browser validation:
742
+
743
+ ```ruby
744
+ SimpleForm.browser_validations = false # default is true
745
+ ```
746
+
747
+ This option adds a new `novalidate` property to the form, instructing it to skip all HTML 5
748
+ validation. The inputs will still be generated with the required and other attributes, that might
749
+ help you to use some generic javascript validation.
750
+
751
+ You can also add `novalidate` to a specific form by setting the option on the form itself:
752
+
753
+ ```erb
754
+ <%= simple_form_for(resource, :html => {:novalidate => true}) do |form| %>
755
+ ```
756
+
757
+ Please notice that any of the configurations above will disable the `placeholder` component,
758
+ which is an HTML 5 feature. We believe most of the newest browsers are handling this attribute fine,
759
+ and if they aren't, any plugin you use would take of using the placeholder attribute to do it.
760
+ However, you can disable it if you want, by removing the placeholder component from the components
761
+ list in **SimpleForm** configuration file.
762
+
763
+ ## Information
764
+
765
+ ### Google Group
766
+
767
+ If you have any questions, comments, or concerns please use the Google Group instead of the GitHub
768
+ Issues tracker:
769
+
770
+ http://groups.google.com/group/plataformatec-simpleform
771
+
772
+ ### RDocs
773
+
774
+ You can view the **SimpleForm** documentation in RDoc format here:
775
+
776
+ http://rubydoc.info/github/plataformatec/simple_form/master/frames
777
+
778
+ If you need to use **SimpleForm** with Rails 2.3, you can always run `gem server` from the command line
779
+ after you install the gem to access the old documentation.
780
+
781
+ ### Bug reports
782
+
783
+ If you discover any bugs, feel free to create an issue on GitHub. Please add as much information as
784
+ possible to help us fixing the possible bug. We also encourage you to help even more by forking and
785
+ sending us a pull request.
786
+
787
+ https://github.com/plataformatec/simple_form/issues
788
+
789
+ ## Maintainers
790
+
791
+ * José Valim (https://github.com/josevalim)
792
+ * Carlos Antonio da Silva (https://github.com/carlosantoniodasilva)
793
+ * Rafael Mendonça França (https://github.com/rafaelfranca)
794
+
795
+ ## License
796
+
797
+ MIT License. Copyright 2012 Plataforma Tecnologia. http://blog.plataformatec.com.br