bootstrap_form 2.2.0 → 2.3.0
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.
- checksums.yaml +4 -4
- data/README.md +61 -6
- data/lib/bootstrap_form/form_builder.rb +95 -31
- data/lib/bootstrap_form/version.rb +1 -1
- data/test/bootstrap_checkbox_test.rb +66 -0
- data/test/bootstrap_fields_test.rb +1 -1
- data/test/bootstrap_form_group_test.rb +52 -14
- data/test/bootstrap_form_test.rb +35 -7
- data/test/bootstrap_other_components_test.rb +1 -1
- data/test/bootstrap_radio_button_test.rb +77 -0
- data/test/dummy/app/models/super_user.rb +2 -0
- data/test/dummy/db/migrate/20140922133133_add_type_to_users.rb +5 -0
- data/test/dummy/db/schema.rb +2 -1
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +957 -1084
- data/test/test_helper.rb +1 -0
- metadata +23 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 319bdcb130ea16ed9c69b8765dacf04e1666a35c
|
4
|
+
data.tar.gz: ce99ec8cf9fd4235eb9bde58e3f88a44df5da0b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a44aad58c31502e3cdd179b254ea3b705798223beae55fb996aeb1b84ec42beb85116ee01da593b34a0373c6f6246ed1f0137af964162f15570efb21c281076
|
7
|
+
data.tar.gz: ff91c59ec997473c5cf8ecb14d25ae4cc5a45c6406130bff044f3b1a72ea12880ca81e313636a4fc447df82adc3b2a3c15cc590cbce0fa2879184e3ad68d7412
|
data/README.md
CHANGED
@@ -115,7 +115,7 @@ This gem wraps the following Rails form helpers:
|
|
115
115
|
* time_zone_select
|
116
116
|
* url_field
|
117
117
|
* week_field
|
118
|
-
|
118
|
+
|
119
119
|
These helpers accept the same options as the standard Rails form helpers, with
|
120
120
|
a few extra options:
|
121
121
|
|
@@ -134,6 +134,30 @@ class, which keeps your labels accessible to those using screen readers.
|
|
134
134
|
<%= f.text_area :comment, hide_label: :true, placeholder: "Leave a comment..." %>
|
135
135
|
```
|
136
136
|
|
137
|
+
To add custom classes to the field's label:
|
138
|
+
|
139
|
+
```erb
|
140
|
+
<%= f.text_field :email, label_class: "custom-class" %>
|
141
|
+
```
|
142
|
+
|
143
|
+
#### Required Fields
|
144
|
+
|
145
|
+
A label that is associated with a required field is automatically annotated with
|
146
|
+
a `required` CSS class. You are free to add any appropriate CSS to style
|
147
|
+
required fields as desired. One example would be to automatically add an
|
148
|
+
asterisk to the end of the label:
|
149
|
+
|
150
|
+
```css
|
151
|
+
label.required:after {
|
152
|
+
content:" *";
|
153
|
+
}
|
154
|
+
```
|
155
|
+
|
156
|
+
The label `required` class is determined based on the definition of a presence
|
157
|
+
validator with the associated model attribute. Presently this is one of:
|
158
|
+
ActiveRecord::Validations::PresenceValidator or
|
159
|
+
ActiveModel::Validations::PresenceValidator.
|
160
|
+
|
137
161
|
### Help Text
|
138
162
|
|
139
163
|
To add help text, use the `help` option:
|
@@ -152,6 +176,9 @@ en:
|
|
152
176
|
password: "A good password should be at least six characters long"
|
153
177
|
```
|
154
178
|
|
179
|
+
If your model name has multiple words (like `SuperUser`), the key on the
|
180
|
+
translation file should be underscored (`super_user`).
|
181
|
+
|
155
182
|
You can override help translations for a particular field by passing the `help`
|
156
183
|
option or turn them off completely by passing `help: false`.
|
157
184
|
|
@@ -257,7 +284,7 @@ To display checkboxes and radios inline, pass the `inline: true` option:
|
|
257
284
|
|
258
285
|
#### Collections
|
259
286
|
|
260
|
-
BootstrapForms also
|
287
|
+
BootstrapForms also provides helpers that automatically creates the
|
261
288
|
`form_group` and the `radio_button`s or `check_box`es for you:
|
262
289
|
|
263
290
|
```erb
|
@@ -316,7 +343,7 @@ buttons.
|
|
316
343
|
```
|
317
344
|
|
318
345
|
You can also use the `primary` helper, which adds `btn btn-primary` to your
|
319
|
-
submit button
|
346
|
+
submit button:
|
320
347
|
|
321
348
|
```erb
|
322
349
|
<%= f.primary "Optional Label" %>
|
@@ -357,6 +384,12 @@ using screen readers.
|
|
357
384
|
<% end %>
|
358
385
|
```
|
359
386
|
|
387
|
+
To skip label rendering at all, use `skip_label: true` option.
|
388
|
+
|
389
|
+
```erb
|
390
|
+
<%= f.password_field :password, skip_label: true %>
|
391
|
+
```
|
392
|
+
|
360
393
|
### Horizontal Forms
|
361
394
|
|
362
395
|
To use a horizontal-layout form with labels to the left of the control, use the
|
@@ -393,7 +426,7 @@ The `label_col` and `control_col` css classes can also be changed per control:
|
|
393
426
|
|
394
427
|
### Custom Field Layout
|
395
428
|
|
396
|
-
The `layout` can be
|
429
|
+
The `layout` can be overridden per field:
|
397
430
|
|
398
431
|
```erb
|
399
432
|
<%= bootstrap_form_for(@user, layout: :horizontal) do |f| %>
|
@@ -430,6 +463,26 @@ You can turn off inline errors for the entire form like this:
|
|
430
463
|
<% end %>
|
431
464
|
```
|
432
465
|
|
466
|
+
### Label Errors
|
467
|
+
|
468
|
+
You can also display validation errors in the field's label; just turn
|
469
|
+
on the `:label_errors` option. Here's an example:
|
470
|
+
|
471
|
+
```
|
472
|
+
<%= bootstrap_form_for(@user, label_errors: true) do |f| %>
|
473
|
+
...
|
474
|
+
<% end %>
|
475
|
+
```
|
476
|
+
|
477
|
+
By default, turning on `:label_errors` will also turn off
|
478
|
+
`:inline_errors`. If you want both turned on, you can do that too:
|
479
|
+
|
480
|
+
```
|
481
|
+
<%= bootstrap_form_for(@user, label_errors: true, inline_errors: true) do |f| %>
|
482
|
+
...
|
483
|
+
<% end %>
|
484
|
+
```
|
485
|
+
|
433
486
|
### Alert Messages
|
434
487
|
|
435
488
|
To display an error message with an error summary, you can use the
|
@@ -515,8 +568,10 @@ We love pull requests! Here's a quick guide for contributing:
|
|
515
568
|
|
516
569
|
2. Run the existing test suite:
|
517
570
|
|
518
|
-
|
519
|
-
|
571
|
+
```
|
572
|
+
$ bundle exec rake -f test/dummy/Rakefile db:create db:migrate RAILS_ENV=test
|
573
|
+
$ bundle exec rake
|
574
|
+
```
|
520
575
|
|
521
576
|
3. Add tests for your change.
|
522
577
|
|
@@ -4,7 +4,7 @@ module BootstrapForm
|
|
4
4
|
class FormBuilder < ActionView::Helpers::FormBuilder
|
5
5
|
include BootstrapForm::Helpers::Bootstrap
|
6
6
|
|
7
|
-
attr_reader :layout, :label_col, :control_col, :has_error, :inline_errors, :acts_like_form_tag
|
7
|
+
attr_reader :layout, :label_col, :control_col, :has_error, :inline_errors, :label_errors, :acts_like_form_tag
|
8
8
|
|
9
9
|
FIELD_HELPERS = %w{color_field date_field datetime_field datetime_local_field
|
10
10
|
email_field month_field number_field password_field phone_field
|
@@ -19,7 +19,12 @@ module BootstrapForm
|
|
19
19
|
@layout = options[:layout]
|
20
20
|
@label_col = options[:label_col] || default_label_col
|
21
21
|
@control_col = options[:control_col] || default_control_col
|
22
|
-
@
|
22
|
+
@label_errors = options[:label_errors] || false
|
23
|
+
@inline_errors = if options[:inline_errors].nil?
|
24
|
+
@label_errors != true
|
25
|
+
else
|
26
|
+
options[:inline_errors] != false
|
27
|
+
end
|
23
28
|
@acts_like_form_tag = options[:acts_like_form_tag]
|
24
29
|
|
25
30
|
super
|
@@ -95,19 +100,24 @@ module BootstrapForm
|
|
95
100
|
|
96
101
|
def check_box_with_bootstrap(name, options = {}, checked_value = "1", unchecked_value = "0", &block)
|
97
102
|
options = options.symbolize_keys!
|
103
|
+
check_box_options = options.except(:label, :label_class, :help, :inline)
|
98
104
|
|
99
|
-
html = check_box_without_bootstrap(name,
|
105
|
+
html = check_box_without_bootstrap(name, check_box_options, checked_value, unchecked_value)
|
100
106
|
label_content = block_given? ? capture(&block) : options[:label]
|
101
107
|
html.concat(" ").concat(label_content || (object && object.class.human_attribute_name(name)) || name.to_s.humanize)
|
102
108
|
|
103
109
|
label_name = name
|
104
110
|
label_name = "#{name}_#{checked_value}" if options[:multiple]
|
105
111
|
|
112
|
+
disabled_class = " disabled" if options[:disabled]
|
113
|
+
label_class = options[:label_class]
|
114
|
+
|
106
115
|
if options[:inline]
|
107
|
-
|
116
|
+
label_class = " #{label_class}" if label_class
|
117
|
+
label(label_name, html, class: "checkbox-inline#{disabled_class}#{label_class}")
|
108
118
|
else
|
109
|
-
content_tag(:div, class: "checkbox") do
|
110
|
-
label(label_name, html)
|
119
|
+
content_tag(:div, class: "checkbox#{disabled_class}") do
|
120
|
+
label(label_name, html, class: label_class)
|
111
121
|
end
|
112
122
|
end
|
113
123
|
end
|
@@ -116,15 +126,19 @@ module BootstrapForm
|
|
116
126
|
|
117
127
|
def radio_button_with_bootstrap(name, value, *args)
|
118
128
|
options = args.extract_options!.symbolize_keys!
|
119
|
-
args << options.except(:label, :help, :inline)
|
129
|
+
args << options.except(:label, :label_class, :help, :inline)
|
120
130
|
|
121
131
|
html = radio_button_without_bootstrap(name, value, *args) + " " + options[:label]
|
122
132
|
|
133
|
+
disabled_class = " disabled" if options[:disabled]
|
134
|
+
label_class = options[:label_class]
|
135
|
+
|
123
136
|
if options[:inline]
|
124
|
-
|
137
|
+
label_class = " #{label_class}" if label_class
|
138
|
+
label(name, html, class: "radio-inline#{disabled_class}#{label_class}", value: value)
|
125
139
|
else
|
126
|
-
content_tag(:div, class: "radio") do
|
127
|
-
label(name, html, value: value)
|
140
|
+
content_tag(:div, class: "radio#{disabled_class}") do
|
141
|
+
label(name, html, value: value, class: label_class)
|
128
142
|
end
|
129
143
|
end
|
130
144
|
end
|
@@ -164,16 +178,15 @@ module BootstrapForm
|
|
164
178
|
options[:class] << " #{feedback_class}" if options[:icon]
|
165
179
|
|
166
180
|
content_tag(:div, options.except(:id, :label, :help, :icon, :label_col, :control_col, :layout)) do
|
167
|
-
label
|
181
|
+
label = generate_label(options[:id], name, options[:label], options[:label_col], options[:layout]) if options[:label]
|
168
182
|
control = capture(&block).to_s
|
169
183
|
control.concat(generate_help(name, options[:help]).to_s)
|
170
184
|
control.concat(generate_icon(options[:icon])) if options[:icon]
|
171
185
|
|
172
186
|
if get_group_layout(options[:layout]) == :horizontal
|
173
187
|
control_class = (options[:control_col] || control_col.clone)
|
174
|
-
|
175
188
|
unless options[:label]
|
176
|
-
control_offset = offset_col(/([0-9]+)$/.match(options[:label_col] ||
|
189
|
+
control_offset = offset_col(/([0-9]+)$/.match(options[:label_col] || @label_col))
|
177
190
|
control_class.concat(" #{control_offset}")
|
178
191
|
end
|
179
192
|
control = content_tag(:div, control, class: control_class)
|
@@ -188,6 +201,8 @@ module BootstrapForm
|
|
188
201
|
fields_options[:layout] ||= options[:layout]
|
189
202
|
fields_options[:label_col] = fields_options[:label_col].present? ? "#{fields_options[:label_col]} #{label_class}" : options[:label_col]
|
190
203
|
fields_options[:control_col] ||= options[:control_col]
|
204
|
+
fields_options[:inline_errors] ||= options[:inline_errors]
|
205
|
+
fields_options[:label_errors] ||= options[:label_errors]
|
191
206
|
fields_for_without_bootstrap(record_name, record_object, fields_options, &block)
|
192
207
|
end
|
193
208
|
|
@@ -243,6 +258,24 @@ module BootstrapForm
|
|
243
258
|
object.respond_to?(:errors) && !(name.nil? || object.errors[name].empty?)
|
244
259
|
end
|
245
260
|
|
261
|
+
def required_attribute?(obj, attribute)
|
262
|
+
|
263
|
+
return false unless obj and attribute
|
264
|
+
|
265
|
+
target = (obj.class == Class) ? obj : obj.class
|
266
|
+
target_validators = target.validators_on(attribute).map(&:class)
|
267
|
+
|
268
|
+
has_presence_validator = target_validators.include?(
|
269
|
+
ActiveModel::Validations::PresenceValidator)
|
270
|
+
|
271
|
+
if defined? ActiveRecord::Validations::PresenceValidator
|
272
|
+
has_presence_validator |= target_validators.include?(
|
273
|
+
ActiveRecord::Validations::PresenceValidator)
|
274
|
+
end
|
275
|
+
|
276
|
+
has_presence_validator
|
277
|
+
end
|
278
|
+
|
246
279
|
def form_group_builder(method, options, html_options = nil)
|
247
280
|
options.symbolize_keys!
|
248
281
|
html_options.symbolize_keys! if html_options
|
@@ -254,10 +287,8 @@ module BootstrapForm
|
|
254
287
|
|
255
288
|
options = convert_form_tag_options(method, options) if acts_like_form_tag
|
256
289
|
|
257
|
-
|
258
|
-
|
259
|
-
wrapper_class = options.delete(:wrapper_class)
|
260
|
-
wrapper_options = options.delete(:wrapper)
|
290
|
+
wrapper_class = css_options.delete(:wrapper_class)
|
291
|
+
wrapper_options = css_options.delete(:wrapper)
|
261
292
|
help = options.delete(:help)
|
262
293
|
icon = options.delete(:icon)
|
263
294
|
label_col = options.delete(:label_col)
|
@@ -265,10 +296,6 @@ module BootstrapForm
|
|
265
296
|
layout = get_group_layout(options.delete(:layout))
|
266
297
|
form_group_options = {
|
267
298
|
id: options[:id],
|
268
|
-
label: {
|
269
|
-
text: label,
|
270
|
-
class: label_class
|
271
|
-
},
|
272
299
|
help: help,
|
273
300
|
icon: icon,
|
274
301
|
label_col: label_col,
|
@@ -278,7 +305,17 @@ module BootstrapForm
|
|
278
305
|
}
|
279
306
|
|
280
307
|
if wrapper_options.is_a?(Hash)
|
281
|
-
form_group_options.
|
308
|
+
form_group_options.merge!(wrapper_options)
|
309
|
+
end
|
310
|
+
|
311
|
+
unless options.delete(:skip_label)
|
312
|
+
label_class = hide_class if options.delete(:hide_label)
|
313
|
+
label_class ||= options.delete(:label_class)
|
314
|
+
|
315
|
+
form_group_options.reverse_merge!(label: {
|
316
|
+
text: options.delete(:label),
|
317
|
+
class: label_class
|
318
|
+
})
|
282
319
|
end
|
283
320
|
|
284
321
|
form_group(method, form_group_options) do
|
@@ -296,16 +333,26 @@ module BootstrapForm
|
|
296
333
|
options[:for] = id if acts_like_form_tag
|
297
334
|
classes = [options[:class], label_class]
|
298
335
|
classes << (custom_label_col || label_col) if get_group_layout(group_layout) == :horizontal
|
336
|
+
classes << "required" if required_attribute?(object, name)
|
337
|
+
|
299
338
|
options[:class] = classes.compact.join(" ")
|
300
339
|
|
301
|
-
|
340
|
+
if label_errors && has_error?(name)
|
341
|
+
error_messages = get_error_messages(name)
|
342
|
+
label_text = (options[:text] || object.class.human_attribute_name(name)).to_s.concat(" #{error_messages}")
|
343
|
+
label(name, label_text, options.except(:text))
|
344
|
+
else
|
345
|
+
label(name, options[:text], options.except(:text))
|
346
|
+
end
|
347
|
+
|
302
348
|
end
|
303
349
|
|
304
350
|
def generate_help(name, help_text)
|
305
|
-
help_text =
|
351
|
+
help_text = get_error_messages(name) if has_error?(name) && inline_errors
|
306
352
|
return if help_text === false
|
307
353
|
|
308
|
-
help_text ||=
|
354
|
+
help_text ||= get_help_text_by_i18n_key(name)
|
355
|
+
|
309
356
|
content_tag(:span, help_text, class: 'help-block') if help_text.present?
|
310
357
|
end
|
311
358
|
|
@@ -313,26 +360,43 @@ module BootstrapForm
|
|
313
360
|
content_tag(:span, "", class: "glyphicon glyphicon-#{icon} form-control-feedback")
|
314
361
|
end
|
315
362
|
|
363
|
+
def get_error_messages(name)
|
364
|
+
object.errors[name].join(", ")
|
365
|
+
end
|
366
|
+
|
316
367
|
def inputs_collection(name, collection, value, text, options = {}, &block)
|
317
368
|
form_group_builder(name, options) do
|
318
369
|
inputs = ""
|
319
370
|
|
320
371
|
collection.each do |obj|
|
321
|
-
input_options = options.merge(label: obj.send(text))
|
372
|
+
input_options = options.merge(label: text.respond_to?(:call) ? text.call(obj) : obj.send(text))
|
322
373
|
|
374
|
+
input_value = value.respond_to?(:call) ? value.call(obj) : obj.send(value)
|
323
375
|
if checked = input_options[:checked]
|
324
|
-
input_options[:checked] = checked ==
|
325
|
-
checked.try(:include?,
|
326
|
-
checked == obj
|
327
|
-
checked.try(:include?, obj)
|
376
|
+
input_options[:checked] = checked == input_value ||
|
377
|
+
Array(checked).try(:include?, input_value) ||
|
378
|
+
checked == obj ||
|
379
|
+
Array(checked).try(:include?, obj)
|
328
380
|
end
|
329
381
|
|
330
382
|
input_options.delete(:class)
|
331
|
-
inputs << block.call(name,
|
383
|
+
inputs << block.call(name, input_value, input_options)
|
332
384
|
end
|
333
385
|
|
334
386
|
inputs.html_safe
|
335
387
|
end
|
336
388
|
end
|
389
|
+
|
390
|
+
def get_help_text_by_i18n_key(name)
|
391
|
+
underscored_scope = "activerecord.help.#{object.class.name.underscore}"
|
392
|
+
downcased_scope = "activerecord.help.#{object.class.name.downcase}"
|
393
|
+
help_text = I18n.t(name, scope: underscored_scope, default: '').presence
|
394
|
+
help_text ||= if text = I18n.t(name, scope: downcased_scope, default: '').presence
|
395
|
+
warn "I18n key '#{downcased_scope}.#{name}' is deprecated, use '#{underscored_scope}.#{name}' instead"
|
396
|
+
text
|
397
|
+
end
|
398
|
+
|
399
|
+
help_text
|
400
|
+
end
|
337
401
|
end
|
338
402
|
end
|
@@ -12,6 +12,11 @@ class BootstrapCheckboxTest < ActionView::TestCase
|
|
12
12
|
assert_equal expected, @builder.check_box(:terms, label: 'I agree to the terms')
|
13
13
|
end
|
14
14
|
|
15
|
+
test "disabled check_box has proper wrapper classes" do
|
16
|
+
expected = %{<div class="checkbox disabled"><label for="user_terms"><input disabled="disabled" name="user[terms]" type="hidden" value="0" /><input disabled="disabled" id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label></div>}
|
17
|
+
assert_equal expected, @builder.check_box(:terms, label: 'I agree to the terms', disabled: true)
|
18
|
+
end
|
19
|
+
|
15
20
|
test "check_box label allows html" do
|
16
21
|
expected = %{<div class="checkbox"><label for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the <a href="#">terms</a></label></div>}
|
17
22
|
assert_equal expected, @builder.check_box(:terms, label: %{I agree to the <a href="#">terms</a>}.html_safe)
|
@@ -22,6 +27,11 @@ class BootstrapCheckboxTest < ActionView::TestCase
|
|
22
27
|
assert_equal expected, @builder.check_box(:terms) { "I agree to the terms" }
|
23
28
|
end
|
24
29
|
|
30
|
+
test "check_box accepts a custom label class" do
|
31
|
+
expected = %{<div class="checkbox"><label class="btn" for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> Terms</label></div>}
|
32
|
+
assert_equal expected, @builder.check_box(:terms, label_class: 'btn')
|
33
|
+
end
|
34
|
+
|
25
35
|
test "check_box responds to checked_value and unchecked_value arguments" do
|
26
36
|
expected = %{<div class="checkbox"><label for="user_terms"><input name="user[terms]" type="hidden" value="no" /><input id="user_terms" name="user[terms]" type="checkbox" value="yes" /> I agree to the terms</label></div>}
|
27
37
|
assert_equal expected, @builder.check_box(:terms, {label: 'I agree to the terms'}, 'yes', 'no')
|
@@ -32,6 +42,16 @@ class BootstrapCheckboxTest < ActionView::TestCase
|
|
32
42
|
assert_equal expected, @builder.check_box(:terms, label: 'I agree to the terms', inline: true)
|
33
43
|
end
|
34
44
|
|
45
|
+
test "disabled inline check_box" do
|
46
|
+
expected = %{<label class="checkbox-inline disabled" for="user_terms"><input disabled="disabled" name="user[terms]" type="hidden" value="0" /><input disabled="disabled" id="user_terms" name="user[terms]" type="checkbox" value="1" /> I agree to the terms</label>}
|
47
|
+
assert_equal expected, @builder.check_box(:terms, label: 'I agree to the terms', inline: true, disabled: true)
|
48
|
+
end
|
49
|
+
|
50
|
+
test "inline checkboxes with custom label class" do
|
51
|
+
expected = %{<label class="checkbox-inline btn" for="user_terms"><input name="user[terms]" type="hidden" value="0" /><input id="user_terms" name="user[terms]" type="checkbox" value="1" /> Terms</label>}
|
52
|
+
assert_equal expected, @builder.check_box(:terms, inline: true, label_class: 'btn')
|
53
|
+
end
|
54
|
+
|
35
55
|
test 'collection_check_boxes renders the form_group correctly' do
|
36
56
|
collection = [Address.new(id: 1, street: 'Foobar')]
|
37
57
|
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">This is a checkbox collection</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> Foobar</label></div><span class="help-block">With a help!</span></div>}
|
@@ -68,4 +88,50 @@ class BootstrapCheckboxTest < ActionView::TestCase
|
|
68
88
|
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: [1, 2])
|
69
89
|
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, :street, checked: collection)
|
70
90
|
end
|
91
|
+
|
92
|
+
test 'collection_check_boxes renders multiple checkboxes with labels defined by Proc :text_method correctly' do
|
93
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
94
|
+
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> ooF</label></div><div class="checkbox"><label for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> raB</label></div></div>}
|
95
|
+
|
96
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, Proc.new { |a| a.street.reverse })
|
97
|
+
end
|
98
|
+
|
99
|
+
test 'collection_check_boxes renders multiple checkboxes with values defined by Proc :value_method correctly' do
|
100
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
101
|
+
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
|
102
|
+
|
103
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, Proc.new { |a| "address_#{a.id}" }, :street)
|
104
|
+
end
|
105
|
+
|
106
|
+
test 'collection_check_boxes renders multiple checkboxes with labels defined by lambda :text_method correctly' do
|
107
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
108
|
+
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_1"><input id="user_misc_1" name="user[misc][]" type="checkbox" value="1" /> ooF</label></div><div class="checkbox"><label for="user_misc_2"><input id="user_misc_2" name="user[misc][]" type="checkbox" value="2" /> raB</label></div></div>}
|
109
|
+
|
110
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, :id, lambda { |a| a.street.reverse })
|
111
|
+
end
|
112
|
+
|
113
|
+
test 'collection_check_boxes renders multiple checkboxes with values defined by lambda :value_method correctly' do
|
114
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
115
|
+
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
|
116
|
+
|
117
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, lambda { |a| "address_#{a.id}" }, :street)
|
118
|
+
end
|
119
|
+
|
120
|
+
test 'collection_check_boxes renders with checked option correctly with Proc :value_method' do
|
121
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
122
|
+
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input checked="checked" id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
|
123
|
+
|
124
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, Proc.new { |a| "address_#{a.id}" }, :street, checked: "address_1")
|
125
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, Proc.new { |a| "address_#{a.id}" }, :street, checked: collection.first)
|
126
|
+
end
|
127
|
+
|
128
|
+
test 'collection_check_boxes renders with multiple checked options correctly with lambda :value_method' do
|
129
|
+
collection = [Address.new(id: 1, street: 'Foo'), Address.new(id: 2, street: 'Bar')]
|
130
|
+
expected = %{<input id="user_misc" multiple="multiple" name="user[misc][]" type="hidden" value="" /><div class="form-group"><label class="control-label" for="user_misc">Misc</label><div class="checkbox"><label for="user_misc_address_1"><input checked="checked" id="user_misc_address_1" name="user[misc][]" type="checkbox" value="address_1" /> Foo</label></div><div class="checkbox"><label for="user_misc_address_2"><input checked="checked" id="user_misc_address_2" name="user[misc][]" type="checkbox" value="address_2" /> Bar</label></div></div>}
|
131
|
+
|
132
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, lambda { |a| "address_#{a.id}" }, :street, checked: ["address_1", "address_2"])
|
133
|
+
assert_equal expected, @builder.collection_check_boxes(:misc, collection, lambda { |a| "address_#{a.id}" }, :street, checked: collection)
|
134
|
+
end
|
135
|
+
|
136
|
+
|
71
137
|
end
|