simple_form 2.0.1 → 2.0.2
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.
Potentially problematic release.
This version of simple_form might be problematic. Click here for more details.
- data/CHANGELOG.md +21 -0
- data/MIT-LICENSE +1 -1
- data/README.md +149 -147
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb.tt +3 -1
- data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +7 -5
- data/lib/simple_form/action_view_extensions/builder.rb +4 -2
- data/lib/simple_form/components/hints.rb +2 -1
- data/lib/simple_form/components/labels.rb +1 -1
- data/lib/simple_form/components/min_max.rb +1 -0
- data/lib/simple_form/error_notification.rb +1 -1
- data/lib/simple_form/form_builder.rb +1 -1
- data/lib/simple_form/inputs/base.rb +19 -2
- data/lib/simple_form/inputs/boolean_input.rb +6 -1
- data/lib/simple_form/version.rb +1 -1
- data/test/action_view_extensions/builder_test.rb +6 -0
- data/test/action_view_extensions/form_helper_test.rb +18 -18
- data/test/form_builder/association_test.rb +3 -3
- data/test/form_builder/error_notification_test.rb +1 -1
- data/test/form_builder/general_test.rb +14 -0
- data/test/form_builder/general_test.rb.orig +380 -0
- data/test/form_builder/hint_test.rb +16 -0
- data/test/form_builder/wrapper_test.rb +17 -4
- data/test/inputs/boolean_input_test.rb +14 -0
- data/test/inputs/discovery_test.rb +9 -1
- data/test/inputs/numeric_input_test.rb +6 -0
- data/test/inputs/string_input_test.rb +6 -0
- data/test/support/discovery_inputs.rb +6 -0
- data/test/support/misc_helpers.rb +11 -1
- data/test/support/models.rb +7 -3
- data/test/test_helper.rb +2 -5
- metadata +20 -10
- data/test/support/mock_response.rb +0 -14
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,24 @@ | |
| 1 | 
            +
            ## 2.0.2
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ### enhancements
         | 
| 4 | 
            +
              * Add `:inline_label` option to nested booleans to display text inline with checkbox.
         | 
| 5 | 
            +
              If the value is `true` it uses the default label text. ([@ehoch](https://github.com/ehoch))
         | 
| 6 | 
            +
              * Add html support for hints. ([@findrails](https://github.com/findrails))
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ### bug fix
         | 
| 9 | 
            +
              * Fix `min_max` component to not output maximum value. ([@julian7](https://github.com/julian7)).
         | 
| 10 | 
            +
              Closes [#483](https://github.com/plataformatec/simple_form/issues/483)
         | 
| 11 | 
            +
              * Remove leading and trailing whitespace from `label_text`.
         | 
| 12 | 
            +
              Closes [#492](https://github.com/plataformatec/simple_form/issues/492)
         | 
| 13 | 
            +
              * Fix checked radio button issue when value is false. ([@georgehemmings](https://github.com/georgehemmings)).
         | 
| 14 | 
            +
              * Propagate defaults options to nested forms.
         | 
| 15 | 
            +
              Closes [#553](https://github.com/plataformatec/simple_form/issues/533).
         | 
| 16 | 
            +
              ([@nashby](https://github.com/nashby))
         | 
| 17 | 
            +
              * Fix limit and maxlength with decimal points. ([@shwoodard](https://github.com/shwoodard))
         | 
| 18 | 
            +
              * Fix issue when html are duplicated.
         | 
| 19 | 
            +
              Closes [#488](https://github.com/plataformatec/simple_form/issues/488).
         | 
| 20 | 
            +
              ([@ebonical](https://github.com/ebonical))
         | 
| 21 | 
            +
             | 
| 1 22 | 
             
            ## 2.0.1
         | 
| 2 23 |  | 
| 3 24 | 
             
            ### bug fix
         | 
    
        data/MIT-LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -31,13 +31,6 @@ Also, if you want to use the country select, you will need the | |
| 31 31 |  | 
| 32 32 | 
             
            `gem 'country_select'`
         | 
| 33 33 |  | 
| 34 | 
            -
            ## Configuration
         | 
| 35 | 
            -
             | 
| 36 | 
            -
            **SimpleForm** has several configuration options. You can read and change them in the initializer
         | 
| 37 | 
            -
            created by **SimpleForm**, so if you haven't executed the command below yet, please do:
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            `rails generate simple_form:install`
         | 
| 40 | 
            -
             | 
| 41 34 | 
             
            ### Twitter Bootstrap
         | 
| 42 35 |  | 
| 43 36 | 
             
            **SimpleForm** 2.0 can be easily integrated to the [Twitter Bootstrap](http://twitter.github.com/bootstrap).
         | 
| @@ -54,117 +47,6 @@ For more information see the generator output, our | |
| 54 47 |  | 
| 55 48 | 
             
            **NOTE**: **SimpleForm** integration requires Twitter Bootstrap version 2.0 or higher.
         | 
| 56 49 |  | 
| 57 | 
            -
            ### The wrappers API
         | 
| 58 | 
            -
             | 
| 59 | 
            -
            With **SimpleForm** you can configure how your components will be rendered using the wrappers API.
         | 
| 60 | 
            -
            The syntax looks like this:
         | 
| 61 | 
            -
             | 
| 62 | 
            -
            ```ruby
         | 
| 63 | 
            -
            config.wrappers :tag => :div, :class => :input,
         | 
| 64 | 
            -
                            :error_class => :field_with_errors do |b|
         | 
| 65 | 
            -
             | 
| 66 | 
            -
              # Form extensions
         | 
| 67 | 
            -
              b.use :html5
         | 
| 68 | 
            -
              b.optional :pattern
         | 
| 69 | 
            -
              b.use :maxlength
         | 
| 70 | 
            -
              b.use :placeholder
         | 
| 71 | 
            -
              b.use :readonly
         | 
| 72 | 
            -
             | 
| 73 | 
            -
              # Form components
         | 
| 74 | 
            -
              b.use :label_input
         | 
| 75 | 
            -
              b.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
         | 
| 76 | 
            -
              b.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 77 | 
            -
            end
         | 
| 78 | 
            -
            ```
         | 
| 79 | 
            -
             | 
| 80 | 
            -
            The _Form components_ will generate the form tags like labels, inputs, hints or errors contents.
         | 
| 81 | 
            -
             | 
| 82 | 
            -
            The _Form extensions_ are used to generate some attributes or perform some lookups on the model to
         | 
| 83 | 
            -
            add extra information to your components.
         | 
| 84 | 
            -
             | 
| 85 | 
            -
            You can create new _Form components_ using the wrappers API as in the following example:
         | 
| 86 | 
            -
             | 
| 87 | 
            -
            ```ruby
         | 
| 88 | 
            -
            config.wrappers do |b|
         | 
| 89 | 
            -
              b.use :placeholder
         | 
| 90 | 
            -
              b.use :label_input
         | 
| 91 | 
            -
              b.wrapper :tag => :div, :class => 'separator' do |component|
         | 
| 92 | 
            -
                component.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
         | 
| 93 | 
            -
                component.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 94 | 
            -
              end
         | 
| 95 | 
            -
            end
         | 
| 96 | 
            -
            ```
         | 
| 97 | 
            -
             | 
| 98 | 
            -
            this will wrap the hint and error components within a `div` tag using the class `'separator'`.
         | 
| 99 | 
            -
             | 
| 100 | 
            -
            If you want to customize the custom _Form components_ on demand you can give it a name like this:
         | 
| 101 | 
            -
             | 
| 102 | 
            -
            ```ruby
         | 
| 103 | 
            -
            config.wrappers do |b|
         | 
| 104 | 
            -
              b.use :placeholder
         | 
| 105 | 
            -
              b.use :label_input
         | 
| 106 | 
            -
              b.wrapper :my_wrapper, :tag => :div, :class => 'separator' do |component|
         | 
| 107 | 
            -
                component.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
         | 
| 108 | 
            -
                component.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 109 | 
            -
              end
         | 
| 110 | 
            -
            end
         | 
| 111 | 
            -
            ```
         | 
| 112 | 
            -
             | 
| 113 | 
            -
            and now you can pass options to your `input` calls to customize the `:my_wrapper` _Form component_.
         | 
| 114 | 
            -
             | 
| 115 | 
            -
            ```ruby
         | 
| 116 | 
            -
            # Completely turns off the custom wrapper
         | 
| 117 | 
            -
            f.input :name, :my_wrapper => false
         | 
| 118 | 
            -
             | 
| 119 | 
            -
            # Configure the html
         | 
| 120 | 
            -
            f.input :name, :my_wrapper_html => { :id => 'special_id' }
         | 
| 121 | 
            -
             | 
| 122 | 
            -
            # Configure the tag
         | 
| 123 | 
            -
            f.input :name, :my_wrapper_tag => :p
         | 
| 124 | 
            -
            ```
         | 
| 125 | 
            -
             | 
| 126 | 
            -
            You can also define more than one wrapper and pick one to render in a specific form or input.
         | 
| 127 | 
            -
            To define another wrapper you have to give it a name, as the follow:
         | 
| 128 | 
            -
             | 
| 129 | 
            -
            ```ruby
         | 
| 130 | 
            -
            config.wrappers :small do |b|
         | 
| 131 | 
            -
              b.use :placeholder
         | 
| 132 | 
            -
              b.use :label_input
         | 
| 133 | 
            -
            end
         | 
| 134 | 
            -
            ```
         | 
| 135 | 
            -
             | 
| 136 | 
            -
            and use it in this way:
         | 
| 137 | 
            -
             | 
| 138 | 
            -
            ```ruby
         | 
| 139 | 
            -
            # Specifying to whole form
         | 
| 140 | 
            -
            simple_form_for @user, :wrapper => :small do |f|
         | 
| 141 | 
            -
              f.input :name
         | 
| 142 | 
            -
            end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
            # Specifying to one input
         | 
| 145 | 
            -
            simple_form_for @user do |f|
         | 
| 146 | 
            -
              f.input :name, :wrapper => :small
         | 
| 147 | 
            -
            end
         | 
| 148 | 
            -
            ```
         | 
| 149 | 
            -
             | 
| 150 | 
            -
            **SimpleForm** also allows you to use optional elements. For instance, let's suppose you want to use
         | 
| 151 | 
            -
            hints or placeholders, but you don't want them to be generated automatically. You can set their
         | 
| 152 | 
            -
            default values to `false` or use the `optional` method. Is preferible to use the `optional` syntax:
         | 
| 153 | 
            -
             | 
| 154 | 
            -
            ```ruby
         | 
| 155 | 
            -
            config.wrappers :placeholder => false do |b|
         | 
| 156 | 
            -
              b.use :placeholder
         | 
| 157 | 
            -
              b.use :label_input
         | 
| 158 | 
            -
              b.wrapper :tag => :div, :class => 'separator' do |component|
         | 
| 159 | 
            -
                component.optional :hint, :wrap_with => { :tag => :span, :class => :hint }
         | 
| 160 | 
            -
                component.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 161 | 
            -
              end
         | 
| 162 | 
            -
            end
         | 
| 163 | 
            -
            ```
         | 
| 164 | 
            -
             | 
| 165 | 
            -
            By setting it as `optional`, a hint will only be generated when `:hint => true` is explicitly used.
         | 
| 166 | 
            -
            The same for placehold.
         | 
| 167 | 
            -
             | 
| 168 50 | 
             
            ## Usage
         | 
| 169 51 |  | 
| 170 52 | 
             
            **SimpleForm** was designed to be customized as you need to. Basically it's a stack of components that
         | 
| @@ -383,26 +265,7 @@ drop down then you may use the `:collection` option: | |
| 383 265 | 
             
            f.input :shipping_country, :priority => [ "Brazil" ], :collection => [ "Australia", "Brazil", "New Zealand"]
         | 
| 384 266 | 
             
            ```
         | 
| 385 267 |  | 
| 386 | 
            -
            ###  | 
| 387 | 
            -
             | 
| 388 | 
            -
            **SimpleForm** allows you to add a wrapper which contains the label, error, hint and input.
         | 
| 389 | 
            -
            The first step is to configure a wrapper tag:
         | 
| 390 | 
            -
             | 
| 391 | 
            -
            ```ruby
         | 
| 392 | 
            -
            SimpleForm.wrapper_tag = :p
         | 
| 393 | 
            -
            ```
         | 
| 394 | 
            -
             | 
| 395 | 
            -
            And now, you no longer need to wrap your `f.input` calls anymore:
         | 
| 396 | 
            -
             | 
| 397 | 
            -
            ```erb
         | 
| 398 | 
            -
            <%= simple_form_for @user do |f| %>
         | 
| 399 | 
            -
              <%= f.input :username %>
         | 
| 400 | 
            -
              <%= f.input :password %>
         | 
| 401 | 
            -
              <%= f.button :submit %>
         | 
| 402 | 
            -
            <% end %>
         | 
| 403 | 
            -
            ```
         | 
| 404 | 
            -
             | 
| 405 | 
            -
            ## Associations
         | 
| 268 | 
            +
            ### Associations
         | 
| 406 269 |  | 
| 407 270 | 
             
            To deal with associations, **SimpleForm** can generate select inputs, a series of radios buttons or check boxes.
         | 
| 408 271 | 
             
            Lets see how it works: imagine you have a user model that belongs to a company and has_and_belongs_to_many
         | 
| @@ -451,7 +314,7 @@ the collection by hand, all together with the prompt: | |
| 451 314 | 
             
            f.association :company, :collection => Company.active.all(:order => 'name'), :prompt => "Choose a Company"
         | 
| 452 315 | 
             
            ```
         | 
| 453 316 |  | 
| 454 | 
            -
             | 
| 317 | 
            +
            ### Buttons
         | 
| 455 318 |  | 
| 456 319 | 
             
            All web forms need buttons, right? **SimpleForm** wraps them in the DSL, acting like a proxy:
         | 
| 457 320 |  | 
| @@ -464,7 +327,7 @@ All web forms need buttons, right? **SimpleForm** wraps them in the DSL, acting | |
| 464 327 |  | 
| 465 328 | 
             
            The above will simply call submit. You choose to use it or not, it's just a question of taste.
         | 
| 466 329 |  | 
| 467 | 
            -
             | 
| 330 | 
            +
            ### Wrapping Rails Form Helpers
         | 
| 468 331 |  | 
| 469 332 | 
             
            Say you wanted to use a rails form helper but still wrap it in **SimpleForm** goodness? You can, by
         | 
| 470 333 | 
             
            calling input with a block like so:
         | 
| @@ -478,14 +341,15 @@ calling input with a block like so: | |
| 478 341 | 
             
            In the above example, we're taking advantage of Rails 3's select method that allows us to pass in a
         | 
| 479 342 | 
             
            hash of additional attributes for each option.
         | 
| 480 343 |  | 
| 481 | 
            -
             | 
| 344 | 
            +
            ### Extra helpers
         | 
| 482 345 |  | 
| 483 346 | 
             
            **SimpleForm** also comes with some extra helpers you can use inside rails default forms without relying
         | 
| 484 347 | 
             
            on `simple_form_for` helper. They are listed below.
         | 
| 485 348 |  | 
| 486 | 
            -
             | 
| 349 | 
            +
            #### Simple Fields For
         | 
| 487 350 |  | 
| 488 | 
            -
            Wrapper to use SimpleForm inside a default rails form
         | 
| 351 | 
            +
            Wrapper to use **SimpleForm** inside a default rails form. It works in the same way that the `field_for`
         | 
| 352 | 
            +
            Rails helper, but change the builder to use the `SimpleForm::FormBuilder`.
         | 
| 489 353 |  | 
| 490 354 | 
             
            ```ruby
         | 
| 491 355 | 
             
            form_for @user do |f|
         | 
| @@ -496,7 +360,8 @@ form_for @user do |f| | |
| 496 360 | 
             
            end
         | 
| 497 361 | 
             
            ```
         | 
| 498 362 |  | 
| 499 | 
            -
             | 
| 363 | 
            +
             | 
| 364 | 
            +
            #### Collection Radio Buttons
         | 
| 500 365 |  | 
| 501 366 | 
             
            Creates a collection of radio inputs with labels associated (same API as `collection_select`):
         | 
| 502 367 |  | 
| @@ -513,7 +378,7 @@ end | |
| 513 378 | 
             
            <label class="collection_radio_buttons" for="user_options_false">No</label>
         | 
| 514 379 | 
             
            ```
         | 
| 515 380 |  | 
| 516 | 
            -
             | 
| 381 | 
            +
            #### Collection Check Boxes
         | 
| 517 382 |  | 
| 518 383 | 
             
            Creates a collection of check boxes with labels associated (same API as `collection_select`):
         | 
| 519 384 |  | 
| @@ -544,7 +409,7 @@ end | |
| 544 409 |  | 
| 545 410 | 
             
            **SimpleForm** comes with a lot of default mappings:
         | 
| 546 411 |  | 
| 547 | 
            -
            ```
         | 
| 412 | 
            +
            ```text
         | 
| 548 413 | 
             
            Mapping               Input                         Column Type
         | 
| 549 414 |  | 
| 550 415 | 
             
            boolean               check box                     boolean
         | 
| @@ -603,6 +468,17 @@ class DateTimeInput < SimpleForm::Inputs::DateTimeInput | |
| 603 468 | 
             
            end
         | 
| 604 469 | 
             
            ```
         | 
| 605 470 |  | 
| 471 | 
            +
            Or if you want to add a class to all the select fields you can do:
         | 
| 472 | 
            +
             | 
| 473 | 
            +
            ```ruby
         | 
| 474 | 
            +
            # app/inputs/collection_select_input.rb
         | 
| 475 | 
            +
            class CollectionSelectInput < SimpleForm::Inputs::CollectionSelectInput
         | 
| 476 | 
            +
              def input_html_classes
         | 
| 477 | 
            +
                super.push('chosen')
         | 
| 478 | 
            +
              end
         | 
| 479 | 
            +
            end
         | 
| 480 | 
            +
            ```
         | 
| 481 | 
            +
             | 
| 606 482 | 
             
            ## Custom form builder
         | 
| 607 483 |  | 
| 608 484 | 
             
            You can create a custom form builder that uses **SimpleForm**.
         | 
| @@ -738,6 +614,132 @@ There are other options that can be configured through I18n API, such as require | |
| 738 614 | 
             
            Be sure to check our locale file or the one copied to your application after you run
         | 
| 739 615 | 
             
            `rails generate simple_form:install`.
         | 
| 740 616 |  | 
| 617 | 
            +
            ## Configuration
         | 
| 618 | 
            +
             | 
| 619 | 
            +
            **SimpleForm** has several configuration options. You can read and change them in the initializer
         | 
| 620 | 
            +
            created by **SimpleForm**, so if you haven't executed the command below yet, please do:
         | 
| 621 | 
            +
             | 
| 622 | 
            +
            `rails generate simple_form:install`
         | 
| 623 | 
            +
             | 
| 624 | 
            +
            ### The wrappers API
         | 
| 625 | 
            +
             | 
| 626 | 
            +
            With **SimpleForm** you can configure how your components will be rendered using the wrappers API.
         | 
| 627 | 
            +
            The syntax looks like this:
         | 
| 628 | 
            +
             | 
| 629 | 
            +
            ```ruby
         | 
| 630 | 
            +
            config.wrappers :tag => :div, :class => :input,
         | 
| 631 | 
            +
                            :error_class => :field_with_errors do |b|
         | 
| 632 | 
            +
             | 
| 633 | 
            +
              # Form extensions
         | 
| 634 | 
            +
              b.use :html5
         | 
| 635 | 
            +
              b.optional :pattern
         | 
| 636 | 
            +
              b.use :maxlength
         | 
| 637 | 
            +
              b.use :placeholder
         | 
| 638 | 
            +
              b.use :readonly
         | 
| 639 | 
            +
             | 
| 640 | 
            +
              # Form components
         | 
| 641 | 
            +
              b.use :label_input
         | 
| 642 | 
            +
              b.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
         | 
| 643 | 
            +
              b.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 644 | 
            +
            end
         | 
| 645 | 
            +
            ```
         | 
| 646 | 
            +
             | 
| 647 | 
            +
            The _Form components_ will generate the form tags like labels, inputs, hints or errors contents. The available components are:
         | 
| 648 | 
            +
             | 
| 649 | 
            +
            ```ruby
         | 
| 650 | 
            +
            :label         # The <label> tag alone
         | 
| 651 | 
            +
            :input         # The <input> tag alone
         | 
| 652 | 
            +
            :label_input   # The <label> and the <input> tags
         | 
| 653 | 
            +
            :hint          # The hint for the input
         | 
| 654 | 
            +
            :error         # The error for the input
         | 
| 655 | 
            +
            ```
         | 
| 656 | 
            +
             | 
| 657 | 
            +
            The _Form extensions_ are used to generate some attributes or perform some lookups on the model to
         | 
| 658 | 
            +
            add extra information to your components.
         | 
| 659 | 
            +
             | 
| 660 | 
            +
            You can create new _Form components_ using the wrappers API as in the following example:
         | 
| 661 | 
            +
             | 
| 662 | 
            +
            ```ruby
         | 
| 663 | 
            +
            config.wrappers do |b|
         | 
| 664 | 
            +
              b.use :placeholder
         | 
| 665 | 
            +
              b.use :label_input
         | 
| 666 | 
            +
              b.wrapper :tag => :div, :class => 'separator' do |component|
         | 
| 667 | 
            +
                component.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
         | 
| 668 | 
            +
                component.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 669 | 
            +
              end
         | 
| 670 | 
            +
            end
         | 
| 671 | 
            +
            ```
         | 
| 672 | 
            +
             | 
| 673 | 
            +
            this will wrap the hint and error components within a `div` tag using the class `'separator'`.
         | 
| 674 | 
            +
             | 
| 675 | 
            +
            If you want to customize the custom _Form components_ on demand you can give it a name like this:
         | 
| 676 | 
            +
             | 
| 677 | 
            +
            ```ruby
         | 
| 678 | 
            +
            config.wrappers do |b|
         | 
| 679 | 
            +
              b.use :placeholder
         | 
| 680 | 
            +
              b.use :label_input
         | 
| 681 | 
            +
              b.wrapper :my_wrapper, :tag => :div, :class => 'separator' do |component|
         | 
| 682 | 
            +
                component.use :hint,  :wrap_with => { :tag => :span, :class => :hint }
         | 
| 683 | 
            +
                component.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 684 | 
            +
              end
         | 
| 685 | 
            +
            end
         | 
| 686 | 
            +
            ```
         | 
| 687 | 
            +
             | 
| 688 | 
            +
            and now you can pass options to your `input` calls to customize the `:my_wrapper` _Form component_.
         | 
| 689 | 
            +
             | 
| 690 | 
            +
            ```ruby
         | 
| 691 | 
            +
            # Completely turns off the custom wrapper
         | 
| 692 | 
            +
            f.input :name, :my_wrapper => false
         | 
| 693 | 
            +
             | 
| 694 | 
            +
            # Configure the html
         | 
| 695 | 
            +
            f.input :name, :my_wrapper_html => { :id => 'special_id' }
         | 
| 696 | 
            +
             | 
| 697 | 
            +
            # Configure the tag
         | 
| 698 | 
            +
            f.input :name, :my_wrapper_tag => :p
         | 
| 699 | 
            +
            ```
         | 
| 700 | 
            +
             | 
| 701 | 
            +
            You can also define more than one wrapper and pick one to render in a specific form or input.
         | 
| 702 | 
            +
            To define another wrapper you have to give it a name, as the follow:
         | 
| 703 | 
            +
             | 
| 704 | 
            +
            ```ruby
         | 
| 705 | 
            +
            config.wrappers :small do |b|
         | 
| 706 | 
            +
              b.use :placeholder
         | 
| 707 | 
            +
              b.use :label_input
         | 
| 708 | 
            +
            end
         | 
| 709 | 
            +
            ```
         | 
| 710 | 
            +
             | 
| 711 | 
            +
            and use it in this way:
         | 
| 712 | 
            +
             | 
| 713 | 
            +
            ```ruby
         | 
| 714 | 
            +
            # Specifying to whole form
         | 
| 715 | 
            +
            simple_form_for @user, :wrapper => :small do |f|
         | 
| 716 | 
            +
              f.input :name
         | 
| 717 | 
            +
            end
         | 
| 718 | 
            +
             | 
| 719 | 
            +
            # Specifying to one input
         | 
| 720 | 
            +
            simple_form_for @user do |f|
         | 
| 721 | 
            +
              f.input :name, :wrapper => :small
         | 
| 722 | 
            +
            end
         | 
| 723 | 
            +
            ```
         | 
| 724 | 
            +
             | 
| 725 | 
            +
            **SimpleForm** also allows you to use optional elements. For instance, let's suppose you want to use
         | 
| 726 | 
            +
            hints or placeholders, but you don't want them to be generated automatically. You can set their
         | 
| 727 | 
            +
            default values to `false` or use the `optional` method. Is preferible to use the `optional` syntax:
         | 
| 728 | 
            +
             | 
| 729 | 
            +
            ```ruby
         | 
| 730 | 
            +
            config.wrappers :placeholder => false do |b|
         | 
| 731 | 
            +
              b.use :placeholder
         | 
| 732 | 
            +
              b.use :label_input
         | 
| 733 | 
            +
              b.wrapper :tag => :div, :class => 'separator' do |component|
         | 
| 734 | 
            +
                component.optional :hint, :wrap_with => { :tag => :span, :class => :hint }
         | 
| 735 | 
            +
                component.use :error, :wrap_with => { :tag => :span, :class => :error }
         | 
| 736 | 
            +
              end
         | 
| 737 | 
            +
            end
         | 
| 738 | 
            +
            ```
         | 
| 739 | 
            +
             | 
| 740 | 
            +
            By setting it as `optional`, a hint will only be generated when `:hint => true` is explicitly used.
         | 
| 741 | 
            +
            The same for placehold.
         | 
| 742 | 
            +
             | 
| 741 743 | 
             
            ## HTML 5 Notice
         | 
| 742 744 |  | 
| 743 745 | 
             
            By default, **SimpleForm** will generate input field types and attributes that are supported in HTML5,
         | 
| @@ -813,4 +815,4 @@ https://github.com/plataformatec/simple_form/issues | |
| 813 815 |  | 
| 814 816 | 
             
            ## License
         | 
| 815 817 |  | 
| 816 | 
            -
            MIT License. Copyright 2012  | 
| 818 | 
            +
            MIT License. Copyright 2012 Plataformatec. http://plataformatec.com.br
         | 
| @@ -100,7 +100,9 @@ SimpleForm.setup do |config| | |
| 100 100 | 
             
              # Default class for buttons
         | 
| 101 101 | 
             
              config.button_class = 'btn'
         | 
| 102 102 |  | 
| 103 | 
            -
              # Method used to tidy up errors.
         | 
| 103 | 
            +
              # Method used to tidy up errors. Specify any Rails Array method.
         | 
| 104 | 
            +
              # :first lists the first message for each field.
         | 
| 105 | 
            +
              # Use :to_sentence to list all errors for each field.
         | 
| 104 106 | 
             
              # config.error_method = :first
         | 
| 105 107 |  | 
| 106 108 | 
             
              # Default tag used for error notification helper.
         | 
| @@ -9,16 +9,18 @@ en: | |
| 9 9 | 
             
                  # When using html, text and mark won't be used.
         | 
| 10 10 | 
             
                  # html: '<abbr title="required">*</abbr>'
         | 
| 11 11 | 
             
                error_notification:
         | 
| 12 | 
            -
                  default_message: " | 
| 12 | 
            +
                  default_message: "Please review the problems below:"
         | 
| 13 13 | 
             
                # Labels and hints examples
         | 
| 14 14 | 
             
                # labels:
         | 
| 15 | 
            -
                #    | 
| 15 | 
            +
                #   defaults:
         | 
| 16 | 
            +
                #     password: 'Password'
         | 
| 16 17 | 
             
                #   user:
         | 
| 17 18 | 
             
                #     new:
         | 
| 18 | 
            -
                #       email: 'E-mail  | 
| 19 | 
            +
                #       email: 'E-mail to sign in.'
         | 
| 19 20 | 
             
                #     edit:
         | 
| 20 21 | 
             
                #       email: 'E-mail.'
         | 
| 21 22 | 
             
                # hints:
         | 
| 22 | 
            -
                #    | 
| 23 | 
            -
                # | 
| 23 | 
            +
                #   defaults:
         | 
| 24 | 
            +
                #     username: 'User name to sign in.'
         | 
| 25 | 
            +
                #     password: 'No special characters, please.'
         | 
| 24 26 |  | 
| @@ -193,7 +193,8 @@ module SimpleForm | |
| 193 193 | 
             
                  #   end
         | 
| 194 194 | 
             
                  def simple_fields_for(*args, &block)
         | 
| 195 195 | 
             
                    options = args.extract_options!
         | 
| 196 | 
            -
                    options[:wrapper] | 
| 196 | 
            +
                    options[:wrapper]  ||= self.options[:wrapper]
         | 
| 197 | 
            +
                    options[:defaults] ||= self.options[:defaults]
         | 
| 197 198 |  | 
| 198 199 | 
             
                    if self.class < ActionView::Helpers::FormBuilder
         | 
| 199 200 | 
             
                      options[:builder] ||= self.class
         | 
| @@ -216,7 +217,8 @@ module SimpleForm | |
| 216 217 | 
             
                    html_options = html_options.dup
         | 
| 217 218 |  | 
| 218 219 | 
             
                    [:checked, :selected, :disabled].each do |option|
         | 
| 219 | 
            -
                       | 
| 220 | 
            +
                      current_option = options[option]
         | 
| 221 | 
            +
                      next if current_option.nil?
         | 
| 220 222 |  | 
| 221 223 | 
             
                      accept = if current_option.respond_to?(:call)
         | 
| 222 224 | 
             
                        current_option.call(item)
         | 
| @@ -41,7 +41,7 @@ module SimpleForm | |
| 41 41 | 
             
                  lookups = []
         | 
| 42 42 | 
             
                  lookups << :"#{object_name}"
         | 
| 43 43 | 
             
                  lookups << :default_message
         | 
| 44 | 
            -
                  lookups << " | 
| 44 | 
            +
                  lookups << "Please review the problems below:"
         | 
| 45 45 | 
             
                  I18n.t(lookups.shift, :scope => :"simple_form.error_notification", :default => lookups)
         | 
| 46 46 | 
             
                end
         | 
| 47 47 | 
             
              end
         | 
| @@ -100,7 +100,7 @@ module SimpleForm | |
| 100 100 | 
             
                # == Priority
         | 
| 101 101 | 
             
                #
         | 
| 102 102 | 
             
                # Some inputs, as :time_zone and :country accepts a :priority option. If none is
         | 
| 103 | 
            -
                # given SimpleForm.time_zone_priority and SimpleForm.country_priority are used  | 
| 103 | 
            +
                # given SimpleForm.time_zone_priority and SimpleForm.country_priority are used respectively.
         | 
| 104 104 | 
             
                #
         | 
| 105 105 | 
             
                def input(attribute_name, options={}, &block)
         | 
| 106 106 | 
             
                  options = @defaults.deep_dup.deep_merge(options) if @defaults
         | 
| @@ -48,6 +48,7 @@ module SimpleForm | |
| 48 48 | 
             
                  def initialize(builder, attribute_name, column, input_type, options = {})
         | 
| 49 49 | 
             
                    super
         | 
| 50 50 |  | 
| 51 | 
            +
                    options             = options.dup
         | 
| 51 52 | 
             
                    @builder            = builder
         | 
| 52 53 | 
             
                    @attribute_name     = attribute_name
         | 
| 53 54 | 
             
                    @column             = column
         | 
| @@ -86,7 +87,22 @@ module SimpleForm | |
| 86 87 | 
             
                  end
         | 
| 87 88 |  | 
| 88 89 | 
             
                  def limit
         | 
| 89 | 
            -
                     | 
| 90 | 
            +
                    if column
         | 
| 91 | 
            +
                      decimal_or_float? ? decimal_limit : column_limit
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  def column_limit
         | 
| 96 | 
            +
                    column.limit
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  # Add one for decimal point
         | 
| 100 | 
            +
                  def decimal_limit
         | 
| 101 | 
            +
                    column_limit && (column_limit + 1)
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  def decimal_or_float?
         | 
| 105 | 
            +
                    column.number? && column.type != :integer
         | 
| 90 106 | 
             
                  end
         | 
| 91 107 |  | 
| 92 108 | 
             
                  def nested_boolean_style?
         | 
| @@ -100,7 +116,8 @@ module SimpleForm | |
| 100 116 |  | 
| 101 117 | 
             
                  # Retrieve options for the given namespace from the options hash
         | 
| 102 118 | 
             
                  def html_options_for(namespace, css_classes)
         | 
| 103 | 
            -
                    html_options = options[:"#{namespace}_html"] | 
| 119 | 
            +
                    html_options = options[:"#{namespace}_html"]
         | 
| 120 | 
            +
                    html_options = html_options ? html_options.dup : {}
         | 
| 104 121 | 
             
                    css_classes << html_options[:class] if html_options.key?(:class)
         | 
| 105 122 | 
             
                    html_options[:class] = css_classes
         | 
| 106 123 | 
             
                    html_options
         | 
| @@ -5,7 +5,7 @@ module SimpleForm | |
| 5 5 | 
             
                    if nested_boolean_style?
         | 
| 6 6 | 
             
                      build_hidden_field_for_checkbox +
         | 
| 7 7 | 
             
                        template.label_tag(nil, :class => "checkbox") {
         | 
| 8 | 
            -
                          build_check_box_without_hidden_field
         | 
| 8 | 
            +
                          build_check_box_without_hidden_field + inline_label
         | 
| 9 9 | 
             
                        }
         | 
| 10 10 | 
             
                    else
         | 
| 11 11 | 
             
                      build_check_box
         | 
| @@ -53,6 +53,11 @@ module SimpleForm | |
| 53 53 | 
             
                                          :disabled => input_html_options[:disabled])
         | 
| 54 54 | 
             
                  end
         | 
| 55 55 |  | 
| 56 | 
            +
                  def inline_label
         | 
| 57 | 
            +
                    inline_option = options[:inline_label]
         | 
| 58 | 
            +
                    inline_option == true ? label_text : inline_option
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 56 61 | 
             
                  # Booleans are not required by default because in most of the cases
         | 
| 57 62 | 
             
                  # it makes no sense marking them as required. The only exception is
         | 
| 58 63 | 
             
                  # Terms of Use usually presented at most sites sign up screen.
         | 
    
        data/lib/simple_form/version.rb
    CHANGED
    
    
| @@ -63,6 +63,12 @@ class BuilderTest < ActionView::TestCase | |
| 63 63 | 
             
                assert_select 'form input[type=radio][value=true][checked=checked]'
         | 
| 64 64 | 
             
                assert_no_select 'form input[type=radio][value=false][checked=checked]'
         | 
| 65 65 | 
             
              end
         | 
| 66 | 
            +
             
         | 
| 67 | 
            +
              test 'collection radio accepts checked item which has a value of false' do
         | 
| 68 | 
            +
                with_collection_radio_buttons @user, :active, [[1, true], [0, false]], :last, :first, :checked => false
         | 
| 69 | 
            +
                assert_no_select 'form input[type=radio][value=true][checked=checked]'
         | 
| 70 | 
            +
                assert_select 'form input[type=radio][value=false][checked=checked]'
         | 
| 71 | 
            +
              end
         | 
| 66 72 |  | 
| 67 73 | 
             
              test 'collection radio accepts multiple disabled items' do
         | 
| 68 74 | 
             
                collection = [[1, true], [0, false], [2, 'other']]
         |