simple_form 3.1.0.rc2 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -1
  3. data/README.md +27 -10
  4. data/lib/generators/simple_form/install_generator.rb +2 -2
  5. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +3 -2
  6. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +8 -1
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +85 -4
  8. data/lib/simple_form.rb +13 -2
  9. data/lib/simple_form/action_view_extensions/builder.rb +1 -0
  10. data/lib/simple_form/action_view_extensions/form_helper.rb +5 -1
  11. data/lib/simple_form/components/errors.rb +3 -5
  12. data/lib/simple_form/form_builder.rb +5 -4
  13. data/lib/simple_form/inputs/boolean_input.rb +1 -1
  14. data/lib/simple_form/inputs/collection_input.rb +2 -4
  15. data/lib/simple_form/tags.rb +2 -4
  16. data/lib/simple_form/version.rb +1 -1
  17. data/test/action_view_extensions/builder_test.rb +31 -31
  18. data/test/action_view_extensions/form_helper_test.rb +20 -1
  19. data/test/components/label_test.rb +1 -1
  20. data/test/form_builder/association_test.rb +37 -37
  21. data/test/form_builder/button_test.rb +5 -5
  22. data/test/form_builder/error_test.rb +70 -11
  23. data/test/form_builder/general_test.rb +24 -4
  24. data/test/form_builder/hint_test.rb +3 -3
  25. data/test/form_builder/input_field_test.rb +43 -3
  26. data/test/form_builder/label_test.rb +1 -1
  27. data/test/form_builder/wrapper_test.rb +18 -3
  28. data/test/generators/simple_form_generator_test.rb +2 -2
  29. data/test/inputs/boolean_input_test.rb +9 -1
  30. data/test/inputs/collection_check_boxes_input_test.rb +22 -0
  31. data/test/inputs/collection_radio_buttons_input_test.rb +25 -3
  32. data/test/inputs/collection_select_input_test.rb +17 -17
  33. data/test/inputs/datetime_input_test.rb +1 -1
  34. data/test/inputs/grouped_collection_select_input_test.rb +8 -8
  35. data/test/inputs/numeric_input_test.rb +19 -19
  36. data/test/inputs/priority_input_test.rb +6 -6
  37. data/test/inputs/string_input_test.rb +10 -10
  38. data/test/inputs/text_input_test.rb +3 -3
  39. data/test/support/misc_helpers.rb +6 -0
  40. data/test/support/models.rb +11 -1
  41. data/test/test_helper.rb +5 -1
  42. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88d85494e222c13d302bed66c947ebc999702a46
4
- data.tar.gz: 6974cf74dc9cada33d515c0125c4506262aa4118
3
+ metadata.gz: 275599af691b7ba0bd40146940b8936b7b00bb65
4
+ data.tar.gz: bf12768bc9960272a7823e62276f8191a5b293d7
5
5
  SHA512:
6
- metadata.gz: c2f1599b149fd691ccc0471af01e5f2f997465f55449bfea0924768c45f83510d36911342e54e8c42dfa75adf5da278261188f17c938b3571446b97c419e2011
7
- data.tar.gz: 4c1677e4c36aa1381a378ef3a2c688db1881089d014cb97078f14dd2f5000a618fddc9671f78663fd693c86e4bc8524f3f2c9837aa5e8f7707c9b07b223cf114
6
+ metadata.gz: f62bec40ad89719416a5010cd0ec3eab18a6322289cd817e732061d4b53dd01e6f749a3a1a89caabe2fa233749d9841dea374365572fa91f8dc70755382d6811
7
+ data.tar.gz: 82930fed0d675a74d7e226ebf39e78ebf86807ba583988959be4f633c50f76e3cbc2e2b924d243ce87e5423089610962dab3f1795eb242ce544d985d702c8f36
data/CHANGELOG.md CHANGED
@@ -1,6 +1,7 @@
1
- ## 3.1.0.rc2
1
+ ## 3.1.0
2
2
 
3
3
  ### enhancements
4
+ * Update foundation generator to version 5. [@jorge-d](https://github.com/jorge-d)
4
5
  * Add mapping to `uuid` columns.
5
6
  * Add custom namespaces for custom inputs feature. [@vala](https://github.com/vala)
6
7
  * Add `:unless_blank` option to the wrapper API. [@IanVaughan](https://github.com/IanVaughan)
@@ -27,8 +28,11 @@
27
28
  * Add I18n support to `:include_blank` and `:prompt` when `:translate` is used as value. [@haines](https://github.com/plataformatec/simple_form/pull/616)
28
29
  * Add support to define custom error messages for the attributes.
29
30
  * Add support to change the I18n scope to be used in Simple Form. [@nielsbuus](https://github.com/nielsbuus)
31
+ * The default form class can now be overridden with `html: { :class }`. [@rmm5t](https://github.com/rmm5t)
30
32
 
31
33
  ### bug fix
34
+ * Fix `full_error` when the attribute is an association. [@mvdamme](https://github.com/jorge-d)
35
+ * Fix suppport to `:namespace` and `:index` options for nested check boxes and radio buttons when the attribute is an association.
32
36
  * Collection input that uses automatic collection translation properly sets checked values.
33
37
  Closes [#971](https://github.com/plataformatec/simple_form/issues/971) [@nashby](https://github.com/nashby)
34
38
  * Collection input generates `required` attribute if it has `prompt` option. [@nashby](https://github.com/nashby)
@@ -37,5 +41,9 @@
37
41
  ## deprecation
38
42
  * Methods on custom inputs now accept a required argument with the wrapper options.
39
43
  See https://github.com/plataformatec/simple_form/pull/997 for more information.
44
+ * SimpleForm.form_class is deprecated in favor of SimpleForm.default_form_class.
45
+ Future versions of Simple Form will not generate `simple_form` class for the form
46
+ element.
47
+ See https://github.com/plataformatec/simple_form/pull/1109 for more information.
40
48
 
41
49
  Please check [v3.0](https://github.com/plataformatec/simple_form/blob/v3.0/CHANGELOG.md) for previous changes.
data/README.md CHANGED
@@ -55,9 +55,9 @@ For more information see the generator output, our
55
55
  [example application code](https://github.com/rafaelfranca/simple_form-bootstrap) and
56
56
  [the live example app](http://simple-form-bootstrap.plataformatec.com.br/).
57
57
 
58
- ### Zurb Foundation 3
58
+ ### Zurb Foundation 5
59
59
 
60
- To generate wrappers that are compatible with [Zurb Foundation 3](http://foundation.zurb.com/), pass
60
+ To generate wrappers that are compatible with [Zurb Foundation 5](http://foundation.zurb.com/), pass
61
61
  the `foundation` option to the generator, like this:
62
62
 
63
63
  ```console
@@ -68,7 +68,7 @@ Please note that the Foundation wrapper does not support the `:hint` option by d
68
68
  enable hints, please uncomment the appropriate line in `config/initializers/simple_form_foundation.rb`.
69
69
  You will need to provide your own CSS styles for hints.
70
70
 
71
- Please see the [instructions on how to install Foundation in a Rails app](http://foundation.zurb.com/old-docs/f3/rails.php).
71
+ Please see the [instructions on how to install Foundation in a Rails app](http://foundation.zurb.com/docs/applications.html).
72
72
 
73
73
  ## Usage
74
74
 
@@ -429,6 +429,12 @@ All web forms need buttons, right? **Simple Form** wraps them in the DSL, acting
429
429
 
430
430
  The above will simply call submit. You choose to use it or not, it's just a question of taste.
431
431
 
432
+ The button method also accepts optional parameters, that are delegated to the underlying submit call:
433
+
434
+ ```erb
435
+ <%= f.button :submit, "Custom Button Text", class: "my-button" %>
436
+ ```
437
+
432
438
  ### Wrapping Rails Form Helpers
433
439
 
434
440
  Say you wanted to use a rails form helper but still wrap it in **Simple Form** goodness? You can, by
@@ -455,7 +461,7 @@ Rails helper, but change the builder to use the `SimpleForm::FormBuilder`.
455
461
 
456
462
  ```ruby
457
463
  form_for @user do |f|
458
- simple_fields_for :posts do |posts_form|
464
+ f.simple_fields_for :posts do |posts_form|
459
465
  # Here you have all simple_form methods available
460
466
  posts_form.input :title
461
467
  end
@@ -547,7 +553,9 @@ that extends the string one, you just need to add this file:
547
553
  # app/inputs/currency_input.rb
548
554
  class CurrencyInput < SimpleForm::Inputs::Base
549
555
  def input(wrapper_options)
550
- "$ #{@builder.text_field(attribute_name, input_html_options)}".html_safe
556
+ merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
557
+
558
+ "$ #{@builder.text_field(attribute_name, merged_input_options)}".html_safe
551
559
  end
552
560
  end
553
561
  ```
@@ -977,11 +985,20 @@ You can also add `novalidate` to a specific form by setting the option on the fo
977
985
  <%= simple_form_for(resource, html: { novalidate: true }) do |form| %>
978
986
  ```
979
987
 
980
- Please notice that any of the configurations above will not disable the `placeholder` component,
981
- which is an HTML 5 feature. We believe most of the newest browsers are handling this attribute fine,
982
- and if they aren't, any plugin you use would take of using the placeholder attribute to do it.
983
- However, you can disable it if you want, by removing the placeholder component from the components
984
- list in **Simple Form** configuration file.
988
+ Please notice that none of the configurations above will disable the `placeholder` component,
989
+ which is an HTML 5 feature. We believe most of the newest browsers are handling this attribute
990
+ just fine, and if they aren't, any plugin you use would take care of applying the placeholder.
991
+ In any case, you can disable it if you really want to, by removing the placeholder component
992
+ from the components list in the **Simple Form** configuration file.
993
+
994
+ HTML 5 date / time inputs are not generated by **Simple Form** by default, so using `date`,
995
+ `time` or `datetime` will all generate select boxes using normal Rails helpers. We believe
996
+ browsers are not totally ready for these yet, but you can easily opt-in on a per-input basis
997
+ by passing the html5 option:
998
+
999
+ ```erb
1000
+ <%= f.input :expires_at, as: :date, html5: true %>
1001
+ ```
985
1002
 
986
1003
  ## Information
987
1004
 
@@ -5,11 +5,11 @@ module SimpleForm
5
5
  source_root File.expand_path('../templates', __FILE__)
6
6
  class_option :template_engine, desc: 'Template engine to be invoked (erb, haml or slim).'
7
7
  class_option :bootstrap, type: :boolean, desc: 'Add the Bootstrap wrappers to the SimpleForm initializer.'
8
- class_option :foundation, type: :boolean, desc: 'Add the Zurb Foundation 3 wrappers to the SimpleForm initializer.'
8
+ class_option :foundation, type: :boolean, desc: 'Add the Zurb Foundation 5 wrappers to the SimpleForm initializer.'
9
9
 
10
10
  def info_bootstrap
11
11
  return if options.bootstrap? || options.foundation?
12
- puts "SimpleForm 2 supports Bootstrap and Zurb Foundation 3. If you want "\
12
+ puts "SimpleForm 3 supports Bootstrap and Zurb Foundation 5. If you want "\
13
13
  "a configuration that is compatible with one of these frameworks, then please " \
14
14
  "re-run this generator with --bootstrap or --foundation as an option."
15
15
  end
@@ -103,8 +103,9 @@ SimpleForm.setup do |config|
103
103
  # You can define the class to use on all labels. Default is nil.
104
104
  # config.label_class = nil
105
105
 
106
- # You can define the class to use on all forms. Default is simple_form.
107
- # config.form_class = :simple_form
106
+ # You can define the default class to be used on forms. Can be overriden
107
+ # with `html: { :class }`. Defaulting to none.
108
+ # config.default_form_class = nil
108
109
 
109
110
  # You can define which elements should obtain additional classes
110
111
  # config.generate_additional_classes_for = [:wrapper, :label, :input]
@@ -45,7 +45,8 @@ SimpleForm.setup do |config|
45
45
  config.wrappers :vertical_radio_and_checkboxes, tag: 'div', class: 'form-group', error_class: 'has-error' do |b|
46
46
  b.use :html5
47
47
  b.optional :readonly
48
- b.use :label_input
48
+ b.use :label, class: 'control-label'
49
+ b.use :input
49
50
  b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
50
51
  b.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
51
52
  end
@@ -126,4 +127,10 @@ SimpleForm.setup do |config|
126
127
  # to learn about the different styles for forms and inputs,
127
128
  # buttons and other elements.
128
129
  config.default_wrapper = :vertical_form
130
+ config.wrapper_mappings = {
131
+ check_boxes: :vertical_radio_and_checkboxes,
132
+ radio_buttons: :vertical_radio_and_checkboxes,
133
+ file: :vertical_file_input,
134
+ boolean: :vertical_boolean,
135
+ }
129
136
  end
@@ -1,6 +1,13 @@
1
1
  # Use this setup block to configure all options available in SimpleForm.
2
2
  SimpleForm.setup do |config|
3
- config.wrappers :foundation, class: :input, hint_class: :field_with_hint, error_class: :error do |b|
3
+ # Don't forget to edit this file to adapt it to your needs (specially
4
+ # all the grid-related classes)
5
+ #
6
+ # Please note that hints are commented out by default since Foundation
7
+ # does't provide styles for hints. You will need to provide your own CSS styles for hints.
8
+ # Uncomment them to enable hints.
9
+
10
+ config.wrappers :vertical_form, class: :input, hint_class: :field_with_hint, error_class: :error do |b|
4
11
  b.use :html5
5
12
  b.use :placeholder
6
13
  b.optional :maxlength
@@ -10,17 +17,91 @@ SimpleForm.setup do |config|
10
17
  b.use :label_input
11
18
  b.use :error, wrap_with: { tag: :small, class: :error }
12
19
 
13
- # Uncomment the following line to enable hints. The line is commented out by default since Foundation
14
- # does't provide styles for hints. You will need to provide your own CSS styles for hints.
20
+ # b.use :hint, wrap_with: { tag: :span, class: :hint }
21
+ end
22
+
23
+ config.wrappers :horizontal_form, tag: 'div', class: 'row', hint_class: :field_with_hint, error_class: :error do |b|
24
+ b.use :html5
25
+ b.use :placeholder
26
+ b.optional :maxlength
27
+ b.optional :pattern
28
+ b.optional :min_max
29
+ b.optional :readonly
30
+
31
+ b.wrapper :label_wrapper, tag: :div, class: 'small-3 columns' do |ba|
32
+ ba.use :label, class: 'right inline'
33
+ end
34
+
35
+ b.wrapper :right_input_wrapper, tag: :div, class: 'small-9 columns' do |ba|
36
+ ba.use :input
37
+ ba.use :error, wrap_with: { tag: :small, class: :error }
38
+ # ba.use :hint, wrap_with: { tag: :span, class: :hint }
39
+ end
40
+ end
41
+
42
+ config.wrappers :horizontal_radio_and_checkboxes, tag: 'div', class: 'row' do |b|
43
+ b.use :html5
44
+ b.optional :readonly
45
+
46
+ b.wrapper :container_wrapper, tag: 'div', class: 'small-offset-3 small-9 columns' do |ba|
47
+ ba.wrapper :tag => 'label', :class => 'checkbox' do |bb|
48
+ bb.use :input
49
+ bb.use :label_text
50
+ end
51
+
52
+ ba.use :error, wrap_with: { tag: :small, class: :error }
53
+ # ba.use :hint, wrap_with: { tag: :span, class: :hint }
54
+ end
55
+ end
56
+
57
+ # Foundation does not provide a way to handle inline forms
58
+ # This wrapper can be used to create an inline form
59
+ # by hiding that labels on every screen sizes ('hidden-for-small-up').
60
+ #
61
+ # Note that you need to adapt this wrapper to your needs. If you need a 4
62
+ # columns form then change the wrapper class to 'small-3', if you need
63
+ # only two use 'small-6' and so on.
64
+ config.wrappers :inline_form, tag: 'div', class: 'column small-4', hint_class: :field_with_hint, error_class: :error do |b|
65
+ b.use :html5
66
+ b.use :placeholder
67
+ b.optional :maxlength
68
+ b.optional :pattern
69
+ b.optional :min_max
70
+ b.optional :readonly
71
+
72
+ b.use :label, class: 'hidden-for-small-up'
73
+ b.use :input
74
+
75
+ b.use :error, wrap_with: { tag: :small, class: :error }
76
+ # b.use :hint, wrap_with: { tag: :span, class: :hint }
77
+ end
78
+
79
+ # Examples of use:
80
+ # - wrapper_html: {class: 'row'}, custom_wrapper_html: {class: 'column small-12'}
81
+ # - custom_wrapper_html: {class: 'column small-3 end'}
82
+ config.wrappers :customizable_wrapper, tag: 'div', error_class: :error do |b|
83
+ b.use :html5
84
+ b.optional :readonly
85
+
86
+ b.wrapper :custom_wrapper, tag: :div do |ba|
87
+ ba.use :label_input
88
+ end
89
+
90
+ b.use :error, wrap_with: { tag: :small, class: :error }
15
91
  # b.use :hint, wrap_with: { tag: :span, class: :hint }
16
92
  end
17
93
 
18
94
  # CSS class for buttons
19
95
  config.button_class = 'button'
20
96
 
97
+ # Set this to div to make the checkbox and radio properly work
98
+ # otherwise simple_form adds a label tag instead of a div arround
99
+ # the nested label
100
+ config.item_wrapper_tag = :div
101
+
21
102
  # CSS class to add for error notification helper.
22
103
  config.error_notification_class = 'alert-box alert'
23
104
 
24
105
  # The default wrapper to be used by the FormBuilder.
25
- config.default_wrapper = :foundation
106
+ config.default_wrapper = :vertical_form
26
107
  end
data/lib/simple_form.rb CHANGED
@@ -96,10 +96,16 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
96
96
  mattr_accessor :boolean_style
97
97
  @@boolean_style = :inline
98
98
 
99
- # You can define the class to be used on all forms. Default is simple_form.
100
- mattr_accessor :form_class
99
+ # DEPRECATED: You can define the class to be used on all forms. Default is
100
+ # simple_form.
101
+ mattr_reader :form_class
101
102
  @@form_class = :simple_form
102
103
 
104
+ # You can define the default class to be used on all forms. Can be overriden
105
+ # with `html: { :class }`. Defaults to none.
106
+ mattr_accessor :default_form_class
107
+ @@default_form_class = nil
108
+
103
109
  # You can define which elements should obtain additional classes.
104
110
  mattr_accessor :generate_additional_classes_for
105
111
  @@generate_additional_classes_for = [:wrapper, :label, :input]
@@ -249,6 +255,11 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
249
255
  ActiveSupport::Deprecation.warn "[SIMPLE_FORM] SimpleForm.default_input_size= is deprecated and has no effect", caller
250
256
  end
251
257
 
258
+ def self.form_class=(value)
259
+ ActiveSupport::Deprecation.warn "[SIMPLE_FORM] SimpleForm.form_class= is deprecated and will be removed in 4.x. Use SimpleForm.default_form_class= instead", caller
260
+ @@form_class = value
261
+ end
262
+
252
263
  # Default way to setup Simple Form. Run rails generate simple_form:install
253
264
  # to create a fresh initializer with all configuration values.
254
265
  def self.setup
@@ -17,6 +17,7 @@ module SimpleForm
17
17
  options = args.extract_options!
18
18
  options[:wrapper] = self.options[:wrapper] if options[:wrapper].nil?
19
19
  options[:defaults] ||= self.options[:defaults]
20
+ options[:wrapper_mappings] ||= self.options[:wrapper_mappings]
20
21
 
21
22
  if self.class < ActionView::Helpers::FormBuilder
22
23
  options[:builder] ||= self.class
@@ -16,7 +16,11 @@ module SimpleForm
16
16
  unless options[:html].key?(:novalidate)
17
17
  options[:html][:novalidate] = !SimpleForm.browser_validations
18
18
  end
19
- options[:html][:class] = [SimpleForm.form_class, simple_form_css_class(record, options)].compact.join(" ")
19
+ if options[:html].key?(:class)
20
+ options[:html][:class] = [SimpleForm.form_class, options[:html][:class]].compact
21
+ else
22
+ options[:html][:class] = [SimpleForm.form_class, SimpleForm.default_form_class, simple_form_css_class(record, options)].compact
23
+ end
20
24
 
21
25
  with_simple_form_field_error_proc do
22
26
  form_for(record, options, &block)
@@ -18,13 +18,11 @@ module SimpleForm
18
18
  def error_text
19
19
  text = has_custom_error? ? options[:error] : errors.send(error_method)
20
20
 
21
- "#{html_escape(options[:error_prefix])} #{text}".lstrip.html_safe
21
+ "#{html_escape(options[:error_prefix])} #{html_escape(text)}".lstrip.html_safe
22
22
  end
23
23
 
24
24
  def full_error_text
25
- text = has_custom_error? ? options[:error] : full_errors.send(error_method)
26
-
27
- text.html_safe
25
+ has_custom_error? ? options[:error] : full_errors.send(error_method)
28
26
  end
29
27
 
30
28
  def error_method
@@ -52,7 +50,7 @@ module SimpleForm
52
50
  end
53
51
 
54
52
  def full_errors_on_association
55
- reflection ? object.full_messages_for(reflection.name) : []
53
+ reflection ? object.errors.full_messages_for(reflection.name) : []
56
54
  end
57
55
 
58
56
  def has_custom_error?
@@ -131,14 +131,15 @@ module SimpleForm
131
131
  # name="user[name]" type="text" value="Carlos" />
132
132
  #
133
133
  def input_field(attribute_name, options = {})
134
+ components = (wrapper.components.map(&:namespace) & ATTRIBUTE_COMPONENTS)
135
+
134
136
  options = options.dup
135
- options[:input_html] = options.except(:as, :boolean_style, :collection, :label_method, :value_method, *ATTRIBUTE_COMPONENTS)
137
+ options[:input_html] = options.except(:as, :boolean_style, :collection, :label_method, :value_method, *components)
136
138
  options = @defaults.deep_dup.deep_merge(options) if @defaults
137
139
 
138
140
  input = find_input(attribute_name, options)
139
141
  wrapper = find_wrapper(input.input_type, options)
140
- components = (wrapper.components.map(&:namespace) & ATTRIBUTE_COMPONENTS) + [:input]
141
- components = components.map { |component| SimpleForm::Wrappers::Leaf.new(component) }
142
+ components = components.concat([:input]).map { |component| SimpleForm::Wrappers::Leaf.new(component) }
142
143
 
143
144
  SimpleForm::Wrappers::Root.new(components, wrapper.options.merge(wrapper: false)).render input
144
145
  end
@@ -542,7 +543,7 @@ module SimpleForm
542
543
  end
543
544
 
544
545
  def find_attribute_column(attribute_name)
545
- if @object.respond_to?(:column_for_attribute)
546
+ if @object.respond_to?(:column_for_attribute) && @object.has_attribute?(attribute_name)
546
547
  @object.column_for_attribute(attribute_name)
547
548
  end
548
549
  end
@@ -41,7 +41,7 @@ module SimpleForm
41
41
  # which won't generate the hidden checkbox. This is the default functionality
42
42
  # in Rails > 3.2.1, and is backported in SimpleForm AV helpers.
43
43
  def build_check_box(unchecked_value, options)
44
- @builder.check_box(attribute_name, input_html_options, checked_value, unchecked_value)
44
+ @builder.check_box(attribute_name, options, checked_value, unchecked_value)
45
45
  end
46
46
 
47
47
  # Build a checkbox without generating the hidden field. See
@@ -21,10 +21,8 @@ module SimpleForm
21
21
  options = super
22
22
 
23
23
  options[:include_blank] = true unless skip_include_blank?
24
-
25
- [:prompt, :include_blank].each do |key|
26
- translate_option options, key
27
- end
24
+ translate_option options, :prompt
25
+ translate_option options, :include_blank
28
26
 
29
27
  options
30
28
  end
@@ -16,11 +16,9 @@ module SimpleForm
16
16
  rendered_item = yield item, value, text, default_html_options.merge(additional_html_options)
17
17
 
18
18
  if @options.fetch(:boolean_style, SimpleForm.boolean_style) == :nested
19
- label_options = {}
20
- add_default_name_and_id_for_value(value, label_options)
21
- label_options['for'] = label_options.delete('id')
19
+ label_options = default_html_options.slice(:index, :namespace)
22
20
  label_options['class'] = @options[:item_label_class]
23
- rendered_item = content_tag(:label, rendered_item, label_options)
21
+ rendered_item = @template_object.label(@object_name, sanitize_attribute_name(value), rendered_item, label_options)
24
22
  end
25
23
 
26
24
  item_wrapper_tag ? @template_object.content_tag(item_wrapper_tag, rendered_item, class: item_wrapper_class) : rendered_item
@@ -1,3 +1,3 @@
1
1
  module SimpleForm
2
- VERSION = "3.1.0.rc2".freeze
2
+ VERSION = "3.1.0".freeze
3
3
  end
@@ -263,15 +263,15 @@ class BuilderTest < ActionView::TestCase
263
263
  collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')]
264
264
  with_collection_check_boxes @user, :tag_ids, collection, :id, :name
265
265
 
266
- assert_select 'form input#user_tag_ids_1[type=checkbox][value=1]'
267
- assert_select 'form input#user_tag_ids_2[type=checkbox][value=2]'
266
+ assert_select 'form input#user_tag_ids_1[type=checkbox][value="1"]'
267
+ assert_select 'form input#user_tag_ids_2[type=checkbox][value="2"]'
268
268
  end
269
269
 
270
270
  test "collection check box generates only one hidden field for the entire collection, to ensure something will be sent back to the server when posting an empty collection" do
271
271
  collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')]
272
272
  with_collection_check_boxes @user, :tag_ids, collection, :id, :name
273
273
 
274
- assert_select "form input[type=hidden][name='user[tag_ids][]'][value=]", count: 1
274
+ assert_select "form input[type=hidden][name='user[tag_ids][]'][value='']", count: 1
275
275
  end
276
276
 
277
277
  test "collection check box accepts a collection and generate a serie of checkboxes with labels for label method" do
@@ -301,36 +301,36 @@ class BuilderTest < ActionView::TestCase
301
301
 
302
302
  with_collection_check_boxes user, :tag_ids, collection, :first, :last
303
303
 
304
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
305
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
306
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
304
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
305
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
306
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
307
307
  end
308
308
 
309
309
  test "collection check box accepts selected values as :checked option" do
310
310
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
311
311
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, checked: [1, 3]
312
312
 
313
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
314
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
315
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
313
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
314
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
315
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
316
316
  end
317
317
 
318
318
  test "collection check boxes accepts selected string values as :checked option" do
319
319
  collection = (1..3).map { |i| [i, "Category #{i}"] }
320
320
  with_collection_check_boxes :user, :category_ids, collection, :first, :last, checked: ['1', '3']
321
321
 
322
- assert_select 'input[type=checkbox][value=1][checked=checked]'
323
- assert_select 'input[type=checkbox][value=3][checked=checked]'
324
- assert_no_select 'input[type=checkbox][value=2][checked=checked]'
322
+ assert_select 'input[type=checkbox][value="1"][checked=checked]'
323
+ assert_select 'input[type=checkbox][value="3"][checked=checked]'
324
+ assert_no_select 'input[type=checkbox][value="2"][checked=checked]'
325
325
  end
326
326
 
327
327
  test "collection check box accepts a single checked value" do
328
328
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
329
329
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, checked: 3
330
330
 
331
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
332
- assert_no_select 'form input[type=checkbox][value=1][checked=checked]'
333
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
331
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
332
+ assert_no_select 'form input[type=checkbox][value="1"][checked=checked]'
333
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
334
334
  end
335
335
 
336
336
  test "collection check box accepts selected values as :checked option and override the model values" do
@@ -338,44 +338,44 @@ class BuilderTest < ActionView::TestCase
338
338
  @user.tag_ids = [2]
339
339
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, checked: [1, 3]
340
340
 
341
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
342
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
343
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
341
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
342
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
343
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
344
344
  end
345
345
 
346
346
  test "collection check box accepts multiple disabled items" do
347
347
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
348
348
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, disabled: [1, 3]
349
349
 
350
- assert_select 'form input[type=checkbox][value=1][disabled=disabled]'
351
- assert_select 'form input[type=checkbox][value=3][disabled=disabled]'
352
- assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]'
350
+ assert_select 'form input[type=checkbox][value="1"][disabled=disabled]'
351
+ assert_select 'form input[type=checkbox][value="3"][disabled=disabled]'
352
+ assert_no_select 'form input[type=checkbox][value="2"][disabled=disabled]'
353
353
  end
354
354
 
355
355
  test "collection check box accepts single disable item" do
356
356
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
357
357
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, disabled: 1
358
358
 
359
- assert_select 'form input[type=checkbox][value=1][disabled=disabled]'
360
- assert_no_select 'form input[type=checkbox][value=3][disabled=disabled]'
361
- assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]'
359
+ assert_select 'form input[type=checkbox][value="1"][disabled=disabled]'
360
+ assert_no_select 'form input[type=checkbox][value="3"][disabled=disabled]'
361
+ assert_no_select 'form input[type=checkbox][value="2"][disabled=disabled]'
362
362
  end
363
363
 
364
364
  test "collection check box accepts a proc to disabled items" do
365
365
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
366
366
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, disabled: proc { |i| i.first == 1 }
367
367
 
368
- assert_select 'form input[type=checkbox][value=1][disabled=disabled]'
369
- assert_no_select 'form input[type=checkbox][value=3][disabled=disabled]'
370
- assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]'
368
+ assert_select 'form input[type=checkbox][value="1"][disabled=disabled]'
369
+ assert_no_select 'form input[type=checkbox][value="3"][disabled=disabled]'
370
+ assert_no_select 'form input[type=checkbox][value="2"][disabled=disabled]'
371
371
  end
372
372
 
373
373
  test "collection check box accepts html options" do
374
374
  collection = [[1, 'Tag 1'], [2, 'Tag 2']]
375
375
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, {}, class: 'check'
376
376
 
377
- assert_select 'form input.check[type=checkbox][value=1]'
378
- assert_select 'form input.check[type=checkbox][value=2]'
377
+ assert_select 'form input.check[type=checkbox][value="1"]'
378
+ assert_select 'form input.check[type=checkbox][value="2"]'
379
379
  end
380
380
 
381
381
  test "collection check box with fields for" do
@@ -386,8 +386,8 @@ class BuilderTest < ActionView::TestCase
386
386
  end
387
387
  end
388
388
 
389
- assert_select 'form input#user_post_tag_ids_1[type=checkbox][value=1]'
390
- assert_select 'form input#user_post_tag_ids_2[type=checkbox][value=2]'
389
+ assert_select 'form input#user_post_tag_ids_1[type=checkbox][value="1"]'
390
+ assert_select 'form input#user_post_tag_ids_2[type=checkbox][value="2"]'
391
391
 
392
392
  assert_select 'form label.collection_check_boxes[for=user_post_tag_ids_1]', 'Tag 1'
393
393
  assert_select 'form label.collection_check_boxes[for=user_post_tag_ids_2]', 'Tag 2'