rails_bootstrap_form 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +1487 -21
- data/demo/app/controllers/users_controller.rb +7 -0
- data/demo/app/models/user.rb +1 -1
- data/demo/config/locales/en.rb +6 -0
- data/demo/db/migrate/20230528041919_add_columns_in_users.rb +11 -0
- data/demo/db/schema.rb +8 -1
- data/lib/rails_bootstrap_form/helpers/labels.rb +3 -3
- data/lib/rails_bootstrap_form/inputs/base.rb +1 -1
- data/lib/rails_bootstrap_form/inputs/collection_check_boxes.rb +1 -1
- data/lib/rails_bootstrap_form/inputs/collection_radio_buttons.rb +1 -1
- data/lib/rails_bootstrap_form/version.rb +1 -1
- metadata +3 -2
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# RailsBootstrapForm
|
2
2
|
|
3
|
-
**rails_bootstrap_form** is a Rails form builder that makes it super easy to integrate
|
4
|
-
|
3
|
+
**rails_bootstrap_form** is a Rails form builder that makes it super easy to integrate [Bootstrap 5](https://getbootstrap.com/) forms into your Rails application.
|
4
|
+
`rails_bootstrap_forms`'s form helpers generate the form field and its label along with all the Bootstrap mark-up required for proper Bootstrap display.
|
5
5
|
|
6
6
|
## Minimum Requirements
|
7
7
|
|
@@ -11,18 +11,21 @@
|
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
|
14
|
-
Install Bootstrap 5. There are many ways to do this, depending on the asset pipeline you're using in your Rails application.
|
14
|
+
Install Bootstrap 5. There are many ways to do this, depending on the asset pipeline you're using in your Rails application.
|
15
|
+
One way is to use the gem that works with Sprockets. To do so, in a brand new Rails 7.0 application created _without_ the
|
16
|
+
`--webpacker` option, add the `bootstrap` gem to your `Gemfile`:
|
15
17
|
|
16
18
|
```ruby
|
17
19
|
gem "bootstrap", "~> 5.0"
|
18
20
|
```
|
19
21
|
|
20
|
-
And follow the remaining instructions in the [official bootstrap installation guide](https://github.com/twbs/bootstrap-rubygem#a-ruby-on-rails)
|
22
|
+
And follow the remaining instructions in the [official bootstrap installation guide](https://github.com/twbs/bootstrap-rubygem#a-ruby-on-rails)
|
23
|
+
for setting up `application.scss` and `application.js`.
|
21
24
|
|
22
25
|
Add the `rails_bootstrap_form` gem to your `Gemfile`:
|
23
26
|
|
24
27
|
```ruby
|
25
|
-
gem "rails_bootstrap_form", "~> 0.
|
28
|
+
gem "rails_bootstrap_form", "~> 0.8.1"
|
26
29
|
```
|
27
30
|
|
28
31
|
Then:
|
@@ -36,7 +39,8 @@ If you use Rails in the default mode without any pre-processor, you'll have to a
|
|
36
39
|
*= require rails_bootstrap_form
|
37
40
|
```
|
38
41
|
|
39
|
-
If you followed the [official bootstrap installation guide](https://github.com/twbs/bootstrap-rubygem#a-ruby-on-rails),
|
42
|
+
If you followed the [official bootstrap installation guide](https://github.com/twbs/bootstrap-rubygem#a-ruby-on-rails),
|
43
|
+
you'll probably have switched to SCSS. In this case add the following line to your `application.scss`:
|
40
44
|
|
41
45
|
```scss
|
42
46
|
@import "rails_bootstrap_form";
|
@@ -45,7 +49,7 @@ If you followed the [official bootstrap installation guide](https://github.com/t
|
|
45
49
|
## Configuration
|
46
50
|
|
47
51
|
`rails_bootstrap_form` can be used without any configuration. However, `rails_bootstrap_form` does have an optional configuration file at `config/initializers/rails_bootstrap_form.rb` for setting options that affect all generated forms in an application. This configuration file is created using the generator
|
48
|
-
by running the command
|
52
|
+
by running the command:
|
49
53
|
|
50
54
|
```
|
51
55
|
$ rails generate rails_bootstrap_form:install
|
@@ -71,7 +75,7 @@ The current configuration options are:
|
|
71
75
|
|
72
76
|
### bootstrap_form_for
|
73
77
|
|
74
|
-
To get started, use the `bootstrap_form_for` helper in place of the Rails `form_for` helper. Here's an example:
|
78
|
+
To get started, use the `bootstrap_form_for` helper in place of the Rails [`form_for`](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for) helper. Here's an example:
|
75
79
|
|
76
80
|
![bootstrap_form_for](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/dfc5f03b-049a-4c12-b575-8298cf5551d7)
|
77
81
|
|
@@ -86,7 +90,6 @@ To get started, use the `bootstrap_form_for` helper in place of the Rails `form_
|
|
86
90
|
|
87
91
|
This generates the following HTML:
|
88
92
|
|
89
|
-
|
90
93
|
```html
|
91
94
|
<form role="form" novalidate="novalidate" class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
|
92
95
|
<div class="mb-3">
|
@@ -108,7 +111,7 @@ This generates the following HTML:
|
|
108
111
|
|
109
112
|
### bootstrap_form_with
|
110
113
|
|
111
|
-
To get started, use the `bootstrap_form_with` helper in place of the Rails `form_with` helper. Here's an example:
|
114
|
+
To get started, use the `bootstrap_form_with` helper in place of the Rails [`form_with`](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_with) helper. Here's an example:
|
112
115
|
|
113
116
|
![bootstrap_form_with](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/06c605b9-29e2-4670-9495-0e913508d73f)
|
114
117
|
|
@@ -123,7 +126,6 @@ To get started, use the `bootstrap_form_with` helper in place of the Rails `form
|
|
123
126
|
|
124
127
|
This generates the following HTML:
|
125
128
|
|
126
|
-
|
127
129
|
```html
|
128
130
|
<form role="form" novalidate="novalidate" class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
|
129
131
|
<div class="mb-3">
|
@@ -143,7 +145,7 @@ This generates the following HTML:
|
|
143
145
|
</form>
|
144
146
|
```
|
145
147
|
|
146
|
-
## Bootstrap
|
148
|
+
## Bootstrap Configuration Options
|
147
149
|
|
148
150
|
Here's a list of all possible options you can pass via `bootstrap_form` option that can be attached to the `bootstrap_form_for` or `bootstrap_form_with` or any field helpers inside of it:
|
149
151
|
|
@@ -216,7 +218,7 @@ This generates the following HTML:
|
|
216
218
|
</form>
|
217
219
|
```
|
218
220
|
|
219
|
-
## Supported
|
221
|
+
## Supported Form Helpers
|
220
222
|
|
221
223
|
This gem wraps most of the form field helpers. Here's the current list:
|
222
224
|
|
@@ -228,15 +230,15 @@ datetime_select email_field file_field
|
|
228
230
|
grouped_collection_select hidden_field month_field
|
229
231
|
number_field password_field phone_field
|
230
232
|
radio_button range_field rich_text_area
|
231
|
-
search_field select static_field
|
232
|
-
telephone_field text_area text_field
|
233
|
-
time_field time_select time_zone_select
|
233
|
+
search_field select static_field
|
234
|
+
telephone_field text_area text_field
|
235
|
+
time_field time_select time_zone_select
|
234
236
|
url_field week_field weekday_select
|
235
237
|
```
|
236
238
|
|
237
239
|
## Supported form layouts
|
238
240
|
|
239
|
-
### Vertical
|
241
|
+
### Vertical Layout
|
240
242
|
|
241
243
|
This layout is default layout for the form in which labels are above the fields and labels and fields take 100% of the width.
|
242
244
|
|
@@ -268,11 +270,11 @@ This generates the following HTML:
|
|
268
270
|
</form>
|
269
271
|
```
|
270
272
|
|
271
|
-
### Horizontal
|
273
|
+
### Horizontal Layout
|
272
274
|
|
273
275
|
If you want to align label and field side by side, you can use horizontal layout for the form.
|
274
|
-
You can optionally override `label_col_wrapper_class` and `field_col_wrapper_class`
|
275
|
-
space between label and field.
|
276
|
+
You can optionally override `label_col_wrapper_class` and `field_col_wrapper_class` (they default to `col-sm-2` and `col-sm-10`) at either form level
|
277
|
+
or field helpers if want to customize space between label and field.
|
276
278
|
|
277
279
|
Here's an example of how it looks like by default:
|
278
280
|
|
@@ -305,7 +307,62 @@ This generates the following HTML:
|
|
305
307
|
</form>
|
306
308
|
```
|
307
309
|
|
308
|
-
|
310
|
+
The `label_col_wrapper_class` and `field_col_wrapper_class` css classes can also be changed per control:
|
311
|
+
|
312
|
+
![horizontal_form_custom_classes](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/ae5492f0-4a10-4f63-ae4d-9675bfb93226)
|
313
|
+
|
314
|
+
```erb
|
315
|
+
<%= bootstrap_form_for @user, bootstrap_form: {layout: :horizontal} do |form| %>
|
316
|
+
<%= form.text_field :name %>
|
317
|
+
<%= form.email_field :username, bootstrap_form: {label_col_wrapper_class: "col-sm-2", field_col_wrapper_class: "col-sm-6"} %>
|
318
|
+
<%= form.password_field :password %>
|
319
|
+
<%= form.fields_for :address, include_id: false do |address_form| %>
|
320
|
+
<%= address_form.select :country_id, options_for_select(::Country.pluck(:name, :id), address_form.object.country_id),
|
321
|
+
{include_blank: "Select Country"} %>
|
322
|
+
<% end %>
|
323
|
+
<%= form.primary "Register" %>
|
324
|
+
<% end %>
|
325
|
+
```
|
326
|
+
|
327
|
+
This generates the following HTML:
|
328
|
+
|
329
|
+
```html
|
330
|
+
<form role="form" novalidate="novalidate" class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
|
331
|
+
<div class="row mb-3">
|
332
|
+
<label class="col-form-label col-sm-2 required" for="user_name">Name</label>
|
333
|
+
<div class="col-sm-10">
|
334
|
+
<input class="form-control" aria-required="true" required="required" type="text" name="user[name]" id="user_name">
|
335
|
+
</div>
|
336
|
+
</div>
|
337
|
+
<div class="row mb-3">
|
338
|
+
<label class="col-form-label col-sm-2" for="user_username">Username</label>
|
339
|
+
<div class="col-sm-6">
|
340
|
+
<input class="form-control" type="email" name="user[username]" id="user_username">
|
341
|
+
</div>
|
342
|
+
</div>
|
343
|
+
<div class="row mb-3">
|
344
|
+
<label class="col-form-label col-sm-2 required" for="user_password">Password</label>
|
345
|
+
<div class="col-sm-10">
|
346
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
347
|
+
</div>
|
348
|
+
</div>
|
349
|
+
<div class="row mb-3">
|
350
|
+
<label class="col-form-label col-sm-2 required" for="user_address_attributes_country_id">Country</label>
|
351
|
+
<div class="col-sm-10">
|
352
|
+
<select class="form-select" aria-required="true" required="required" name="user[address_attributes][country_id]" id="user_address_attributes_country_id">
|
353
|
+
<option value="">Select Country</option>
|
354
|
+
<option value="1">India</option>
|
355
|
+
<option value="2">Ireland</option>
|
356
|
+
<option value="3">United States</option>
|
357
|
+
<option value="4">United Kingdom</option>
|
358
|
+
</select>
|
359
|
+
</div>
|
360
|
+
</div>
|
361
|
+
<input type="submit" name="commit" value="Register" class="btn btn-primary" data-disable-with="Register">
|
362
|
+
</form>
|
363
|
+
```
|
364
|
+
|
365
|
+
### Inline Layout
|
309
366
|
|
310
367
|
You may choose to render form elements in one line. Please note that this layout won't render all form elements perfectly. Things like errors messages and help text won't show up right.
|
311
368
|
|
@@ -338,3 +395,1412 @@ This generates the following HTML:
|
|
338
395
|
</div>
|
339
396
|
</form>
|
340
397
|
```
|
398
|
+
|
399
|
+
## Components
|
400
|
+
|
401
|
+
`rails_bootstrap_form` internally supports below components which act as helpers to build fields and their wrappers.
|
402
|
+
|
403
|
+
### Labels
|
404
|
+
|
405
|
+
By default, Rails takes label text from locale file. You can use `label_text` option to change label text
|
406
|
+
generated by the Rails.
|
407
|
+
|
408
|
+
![label_text](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/b6378a06-c8e0-4944-8e0c-940a25964062)
|
409
|
+
|
410
|
+
```erb
|
411
|
+
<%= form.password_field :password, bootstrap_form: {label_text: "New password"} %>
|
412
|
+
```
|
413
|
+
|
414
|
+
This generates the following HTML:
|
415
|
+
|
416
|
+
```html
|
417
|
+
<div class="mb-3">
|
418
|
+
<label class="form-label required" for="user_password">New password</label>
|
419
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
420
|
+
</div>
|
421
|
+
```
|
422
|
+
|
423
|
+
To hide a label, you can set `hide_label` option to `true`. This adds the `visually-hidden` class, which keeps your labels accessible
|
424
|
+
to those using screen readers.
|
425
|
+
|
426
|
+
![hide_label](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/512a16b9-6829-40a2-bf07-f087970c9dac)
|
427
|
+
|
428
|
+
```erb
|
429
|
+
<%= form.password_field :password, bootstrap_form: {hide_label: true} %>
|
430
|
+
```
|
431
|
+
|
432
|
+
This generates the following HTML:
|
433
|
+
|
434
|
+
```html
|
435
|
+
<div class="mb-3">
|
436
|
+
<label class="form-label visually-hidden required" for="user_password">Password</label>
|
437
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
438
|
+
</div>
|
439
|
+
```
|
440
|
+
|
441
|
+
To skip a label, you can set `skip_label` option to `true`. This will not render label in a field wrapper.
|
442
|
+
|
443
|
+
![skip_label](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/251e28ac-b98b-4e6a-8d55-8c0cb061e65a)
|
444
|
+
|
445
|
+
```erb
|
446
|
+
<%= form.password_field :password, bootstrap_form: {skip_label: true} %>
|
447
|
+
```
|
448
|
+
|
449
|
+
This generates the following HTML:
|
450
|
+
|
451
|
+
```html
|
452
|
+
<div class="mb-3">
|
453
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
454
|
+
</div>
|
455
|
+
```
|
456
|
+
|
457
|
+
To add additional CSS class to the label, you can use `additional_label_class` option.
|
458
|
+
|
459
|
+
![additional_label_class](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/b5ab4efe-2512-4ee4-9d35-99d3b7f78171)
|
460
|
+
|
461
|
+
```erb
|
462
|
+
<%= form.password_field :password, bootstrap_form: {additional_label_class: "text-danger"} %>
|
463
|
+
```
|
464
|
+
|
465
|
+
This generates the following HTML:
|
466
|
+
|
467
|
+
```html
|
468
|
+
<div class="mb-3">
|
469
|
+
<label class="form-label text-danger required" for="user_password">Password</label>
|
470
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
471
|
+
</div>
|
472
|
+
```
|
473
|
+
|
474
|
+
### Help Text
|
475
|
+
|
476
|
+
The help text is useful when you want to provide helpful information about a field. By default, `rails_bootstrap_form` takes help text from locale file.
|
477
|
+
If you want to show information regarding any field, you need to add it in locale file of your application. You can also use HTML content for help text.
|
478
|
+
|
479
|
+
```yml
|
480
|
+
en:
|
481
|
+
activerecord:
|
482
|
+
help_texts:
|
483
|
+
user:
|
484
|
+
password: "A strong password should be at least twelve characters long with combination of uppercase letters, lowercase letters, numbers, and symbols"
|
485
|
+
```
|
486
|
+
|
487
|
+
![help_text_from_translation](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/e6d94d8c-9b47-4940-b2e0-6f1efef5a720)
|
488
|
+
|
489
|
+
```erb
|
490
|
+
<%= form.password_field :password %>
|
491
|
+
```
|
492
|
+
|
493
|
+
This generates the following HTML:
|
494
|
+
|
495
|
+
```html
|
496
|
+
<div class="mb-3">
|
497
|
+
<label class="form-label required" for="user_password">Password</label>
|
498
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
499
|
+
<div class="form-text text-muted">A strong password should be at least twelve characters long with combination of uppercase letters, lowercase letters, numbers, and symbols</div>
|
500
|
+
</div>
|
501
|
+
```
|
502
|
+
|
503
|
+
You can customize the help text using `help_text` option:
|
504
|
+
|
505
|
+
![help_text](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/cdfe0e3c-6fcd-45a4-9621-9f0341925a1c)
|
506
|
+
|
507
|
+
```erb
|
508
|
+
<%= form.password_field :password, bootstrap_form: {help_text: "Password should not be disclosed to anyone."} %>
|
509
|
+
```
|
510
|
+
|
511
|
+
This generates the following HTML:
|
512
|
+
|
513
|
+
```html
|
514
|
+
<div class="mb-3">
|
515
|
+
<label class="form-label required" for="user_password">Password</label>
|
516
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
517
|
+
<div class="form-text text-muted">Password should not be disclosed to anyone.</div>
|
518
|
+
</div>
|
519
|
+
```
|
520
|
+
|
521
|
+
You can also disable help text by setting `help_text` option to `false`:
|
522
|
+
|
523
|
+
![help_text_false](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/be1a229a-cffd-447d-b846-9b9588b1b25e)
|
524
|
+
|
525
|
+
```erb
|
526
|
+
<%= form.password_field :password, help_text: false %>
|
527
|
+
```
|
528
|
+
|
529
|
+
This generates the following HTML:
|
530
|
+
|
531
|
+
```html
|
532
|
+
<div class="mb-3">
|
533
|
+
<label class="form-label required" for="user_password">Password</label>
|
534
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
535
|
+
</div>
|
536
|
+
```
|
537
|
+
|
538
|
+
### Input Groups
|
539
|
+
|
540
|
+
Input groups allow prepending and appending arbitrary html or text to the field.
|
541
|
+
|
542
|
+
You can use `prepend` and/or `append` options to attach addons to input fields:
|
543
|
+
|
544
|
+
![input_group_addon](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/e7fb8f52-558d-458d-a112-2ee3bab366db)
|
545
|
+
|
546
|
+
```erb
|
547
|
+
<%= form.number_field :expected_ctc, bootstrap_form: {prepend: "₹", append: ".00"} %>
|
548
|
+
```
|
549
|
+
|
550
|
+
This generates the following HTML:
|
551
|
+
|
552
|
+
```html
|
553
|
+
<div class="mb-3">
|
554
|
+
<label class="form-label" for="user_expected_ctc">Expected CTC</label>
|
555
|
+
<div class="input-group">
|
556
|
+
<span class="input-group-text">₹</span>
|
557
|
+
<input class="form-control" type="number" name="user[expected_ctc]" id="user_expected_ctc">
|
558
|
+
<span class="input-group-text">.00</span>
|
559
|
+
</div>
|
560
|
+
</div>
|
561
|
+
```
|
562
|
+
|
563
|
+
If you want to attach multiple addons to the input, pass them as an array:
|
564
|
+
|
565
|
+
![input_group_multiple_addons](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/8a6179c2-0def-428a-8429-c97db2c4a567)
|
566
|
+
|
567
|
+
```erb
|
568
|
+
<%= form.number_field :expected_ctc, bootstrap_form: {prepend: ["Gross", "₹"], append: [".00", "per annum"]} %>
|
569
|
+
```
|
570
|
+
|
571
|
+
This generates the following HTML:
|
572
|
+
|
573
|
+
```html
|
574
|
+
<div class="mb-3">
|
575
|
+
<label class="form-label" for="user_expected_ctc">Expected CTC</label>
|
576
|
+
<div class="input-group">
|
577
|
+
<span class="input-group-text">Gross</span>
|
578
|
+
<span class="input-group-text">₹</span>
|
579
|
+
<input class="form-control" type="number" name="user[expected_ctc]" id="user_expected_ctc">
|
580
|
+
<span class="input-group-text">.00</span>
|
581
|
+
<span class="input-group-text">per annum</span>
|
582
|
+
</div>
|
583
|
+
</div>
|
584
|
+
```
|
585
|
+
|
586
|
+
You can also prepend and append buttons. Note that these buttons must contain the `btn` class to generate the correct markup.
|
587
|
+
|
588
|
+
![input_group_button](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/f0d1e22a-ca2b-42da-b99c-f3e7003d8c27)
|
589
|
+
|
590
|
+
```erb
|
591
|
+
<%= form.text_field :search, bootstrap_form: {append: form.secondary("Search")} %>
|
592
|
+
```
|
593
|
+
|
594
|
+
This generates the following HTML:
|
595
|
+
|
596
|
+
```html
|
597
|
+
<div class="mb-3">
|
598
|
+
<label class="form-label" for="user_search">Search</label>
|
599
|
+
<div class="input-group">
|
600
|
+
<input class="form-control" type="text" name="user[search]" id="user_search">
|
601
|
+
<input type="submit" name="commit" value="Search" class="btn btn-secondary" data-disable-with="Search">
|
602
|
+
</div>
|
603
|
+
</div>
|
604
|
+
```
|
605
|
+
|
606
|
+
To add additional CSS class to the input group wrapper, you can use `additional_input_group_class` option.
|
607
|
+
|
608
|
+
![additional_input_group_class](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/1814ec85-1efe-4ffc-ba87-c171d1b73e2c)
|
609
|
+
|
610
|
+
```erb
|
611
|
+
<%= form.number_field :expected_ctc, bootstrap_form: {prepend: "₹", append: ".00", additional_input_group_class: "custom-class"} %>
|
612
|
+
```
|
613
|
+
|
614
|
+
This generates the following HTML:
|
615
|
+
|
616
|
+
```html
|
617
|
+
<div class="mb-3">
|
618
|
+
<label class="form-label" for="user_expected_ctc">Expected CTC</label>
|
619
|
+
<div class="input-group custom-class">
|
620
|
+
<span class="input-group-text">₹</span>
|
621
|
+
<input class="form-control" type="number" name="user[expected_ctc]" id="user_expected_ctc">
|
622
|
+
<span class="input-group-text">.00</span>
|
623
|
+
</div>
|
624
|
+
</div>
|
625
|
+
```
|
626
|
+
|
627
|
+
You can customize size of the input group using `size` option. Input group supports `sm` and `lg` values.
|
628
|
+
|
629
|
+
![input_group_size](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/b7236bd6-4dad-4142-b14e-f6325a612958)
|
630
|
+
|
631
|
+
```erb
|
632
|
+
<%= form.number_field :expected_ctc, bootstrap_form: {prepend: "₹", append: ".00", size: :sm} %>
|
633
|
+
```
|
634
|
+
|
635
|
+
This generates the following HTML:
|
636
|
+
|
637
|
+
```html
|
638
|
+
<div class="mb-3">
|
639
|
+
<label class="form-label" for="user_expected_ctc">Expected CTC</label>
|
640
|
+
<div class="input-group input-group-sm">
|
641
|
+
<span class="input-group-text">₹</span>
|
642
|
+
<input class="form-control form-control-sm" type="number" name="user[expected_ctc]" id="user_expected_ctc">
|
643
|
+
<span class="input-group-text">.00</span>
|
644
|
+
</div>
|
645
|
+
</div>
|
646
|
+
```
|
647
|
+
|
648
|
+
## Form Helpers
|
649
|
+
|
650
|
+
Our form helpers accept the same arguments as the default Rails form helpers.
|
651
|
+
In order to apply addition options of `rails_bootstrap_form`, `bootstrap_form` object is passed in `options` argument of the helper.
|
652
|
+
Here's an example of how you pass the arguments for each form helper:
|
653
|
+
|
654
|
+
### check_box
|
655
|
+
|
656
|
+
Our `check_box` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box).
|
657
|
+
This helper will render check box and label for you.
|
658
|
+
|
659
|
+
![check_box](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/5836650c-d536-4f4e-b768-75bca9dd7901)
|
660
|
+
|
661
|
+
```erb
|
662
|
+
<%= form.check_box :remember_me %>
|
663
|
+
```
|
664
|
+
|
665
|
+
This generates the following HTML:
|
666
|
+
|
667
|
+
```html
|
668
|
+
<div class="form-check mb-3">
|
669
|
+
<input name="user[remember_me]" type="hidden" value="0" autocomplete="off">
|
670
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[remember_me]" id="user_remember_me">
|
671
|
+
<label class="form-check-label" for="user_remember_me">Keep me signed in</label>
|
672
|
+
</div>
|
673
|
+
```
|
674
|
+
|
675
|
+
You can set `switch` option to `true` if you want check box to look like switches.
|
676
|
+
|
677
|
+
![check_box_switch](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/20c493ce-7f2c-4ac9-a854-e1520cae6a54)
|
678
|
+
|
679
|
+
```erb
|
680
|
+
<%= form.check_box :remember_me, bootstrap_form: {switch: true} %>
|
681
|
+
```
|
682
|
+
|
683
|
+
This generates the following HTML:
|
684
|
+
|
685
|
+
```html
|
686
|
+
<div class="form-check form-switch mb-3">
|
687
|
+
<input name="user[remember_me]" type="hidden" value="0" autocomplete="off">
|
688
|
+
<input class="form-check-input" type="checkbox" value="1" name="user[remember_me]" id="user_remember_me">
|
689
|
+
<label class="form-check-label" for="user_remember_me">Keep me signed in</label>
|
690
|
+
</div>
|
691
|
+
```
|
692
|
+
|
693
|
+
This helper also renders help text if `help_text` option is set or information of the field is added to the locale file:
|
694
|
+
|
695
|
+
![check_box_help_text](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/071a6ac3-112c-42d0-965f-cd7751fdff19)
|
696
|
+
|
697
|
+
```erb
|
698
|
+
<%= form.check_box :terms, required: true %>
|
699
|
+
```
|
700
|
+
|
701
|
+
This generates the following HTML:
|
702
|
+
|
703
|
+
```html
|
704
|
+
<div class="form-check mb-3">
|
705
|
+
<input name="user[terms]" type="hidden" value="0" autocomplete="off">
|
706
|
+
<input required="required" class="form-check-input" type="checkbox" value="1" name="user[terms]" id="user_terms">
|
707
|
+
<label class="form-check-label required" for="user_terms">I accept terms and conditions</label>
|
708
|
+
<div class="form-text text-muted">You must first accept terms and conditions in order to continue</div>
|
709
|
+
</div>
|
710
|
+
```
|
711
|
+
|
712
|
+
### color_field
|
713
|
+
|
714
|
+
Our `color_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-color_field).
|
715
|
+
|
716
|
+
![color_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/d83f8231-076f-48cc-b27c-4076d6be8ab6)
|
717
|
+
|
718
|
+
```erb
|
719
|
+
<%= form.color_field :favorite_color %>
|
720
|
+
```
|
721
|
+
|
722
|
+
This generates the following HTML:
|
723
|
+
|
724
|
+
```html
|
725
|
+
<div class="mb-3">
|
726
|
+
<label class="form-label required" for="user_favorite_color">Favorite color</label>
|
727
|
+
<input class="form-control form-control-color" aria-required="true" required="required" value="#000000" type="color" name="user[favorite_color]" id="user_favorite_color">
|
728
|
+
</div>
|
729
|
+
```
|
730
|
+
|
731
|
+
### date_field
|
732
|
+
|
733
|
+
Our `date_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-date_field).
|
734
|
+
|
735
|
+
![date_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/ddab2730-4076-4d0d-91c8-08b1f231741b)
|
736
|
+
|
737
|
+
```erb
|
738
|
+
<%= form.date_field :interview_date %>
|
739
|
+
```
|
740
|
+
|
741
|
+
This generates the following HTML:
|
742
|
+
|
743
|
+
```html
|
744
|
+
<div class="mb-3">
|
745
|
+
<label class="form-label" for="user_interview_date">Interview date</label>
|
746
|
+
<input class="form-control" value="2023-05-08" type="date" name="user[interview_date]" id="user_interview_date">
|
747
|
+
</div>
|
748
|
+
```
|
749
|
+
|
750
|
+
### datetime_field
|
751
|
+
|
752
|
+
Our `datetime_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-datetime_field).
|
753
|
+
|
754
|
+
![datetime_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/3b311f50-927f-4aa6-974a-2f5d0d79ff4f)
|
755
|
+
|
756
|
+
```erb
|
757
|
+
<%= form.datetime_field :interview_datetime %>
|
758
|
+
```
|
759
|
+
|
760
|
+
This generates the following HTML:
|
761
|
+
|
762
|
+
```html
|
763
|
+
<div class="mb-3">
|
764
|
+
<label class="form-label" for="user_interview_datetime">Interview date & time</label>
|
765
|
+
<input class="form-control" type="datetime-local" name="user[interview_datetime]" id="user_interview_datetime">
|
766
|
+
</div>
|
767
|
+
```
|
768
|
+
|
769
|
+
### datetime_local_field
|
770
|
+
|
771
|
+
Our `datetime_local_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-datetime_local_field).
|
772
|
+
|
773
|
+
![datetime_local_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/ec9241a4-aa6e-448f-8478-04dba1cb7c11)
|
774
|
+
|
775
|
+
```erb
|
776
|
+
<%= form.datetime_local_field :interview_datetime %>
|
777
|
+
```
|
778
|
+
|
779
|
+
This generates the following HTML:
|
780
|
+
|
781
|
+
```html
|
782
|
+
<div class="mb-3">
|
783
|
+
<label class="form-label" for="user_interview_datetime">Interview date & time</label>
|
784
|
+
<input class="form-control" type="datetime-local" name="user[interview_datetime]" id="user_interview_datetime">
|
785
|
+
</div>
|
786
|
+
```
|
787
|
+
|
788
|
+
### email_field
|
789
|
+
|
790
|
+
Our `email_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-email_field).
|
791
|
+
|
792
|
+
![email_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/a9b61ca1-7eb9-47e4-9bb0-db9f964186e7)
|
793
|
+
|
794
|
+
```erb
|
795
|
+
<%= form.email_field :email %>
|
796
|
+
```
|
797
|
+
|
798
|
+
This generates the following HTML:
|
799
|
+
|
800
|
+
```html
|
801
|
+
<div class="mb-3">
|
802
|
+
<label class="form-label required" for="user_email">Email address</label>
|
803
|
+
<input class="form-control" aria-required="true" required="required" type="email" name="user[email]" id="user_email">
|
804
|
+
</div>
|
805
|
+
```
|
806
|
+
|
807
|
+
### file_field
|
808
|
+
|
809
|
+
Our `file_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-file_field).
|
810
|
+
|
811
|
+
![file_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/d9d41696-b2aa-43f7-9698-d6c339b01de0)
|
812
|
+
|
813
|
+
```erb
|
814
|
+
<%= form.file_field :avatar %>
|
815
|
+
```
|
816
|
+
|
817
|
+
This generates the following HTML:
|
818
|
+
|
819
|
+
```html
|
820
|
+
<div class="mb-3">
|
821
|
+
<label class="form-label" for="user_avatar">Avatar</label>
|
822
|
+
<input class="form-control" type="file" name="user[avatar]" id="user_avatar">
|
823
|
+
</div>
|
824
|
+
```
|
825
|
+
|
826
|
+
### hidden_field
|
827
|
+
|
828
|
+
The `hidden_field` helper in `rails_bootstrap_form` calls the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-hidden_field) directly, and does no additional mark-up.
|
829
|
+
|
830
|
+
### month_field
|
831
|
+
|
832
|
+
Our `month_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-month_field).
|
833
|
+
|
834
|
+
![month_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/39627509-fd90-425b-b4c5-b0a2afdb59ae)
|
835
|
+
|
836
|
+
```erb
|
837
|
+
<%= form.month_field :birth_month %>
|
838
|
+
```
|
839
|
+
|
840
|
+
This generates the following HTML:
|
841
|
+
|
842
|
+
```html
|
843
|
+
<div class="mb-3">
|
844
|
+
<label class="form-label" for="user_birth_month">Birth month</label>
|
845
|
+
<input class="form-control" type="month" name="user[birth_month]" id="user_birth_month">
|
846
|
+
</div>
|
847
|
+
```
|
848
|
+
|
849
|
+
### number_field
|
850
|
+
|
851
|
+
Our `number_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-number_field).
|
852
|
+
|
853
|
+
![number_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/c9018601-991d-4589-bcc1-1a8fb3dc9c18)
|
854
|
+
|
855
|
+
```erb
|
856
|
+
<%= form.number_field :expected_ctc %>
|
857
|
+
```
|
858
|
+
|
859
|
+
This generates the following HTML:
|
860
|
+
|
861
|
+
```html
|
862
|
+
<div class="mb-3">
|
863
|
+
<label class="form-label" for="user_expected_ctc">Expected CTC</label>
|
864
|
+
<input class="form-control" type="number" name="user[expected_ctc]" id="user_expected_ctc">
|
865
|
+
</div>
|
866
|
+
```
|
867
|
+
|
868
|
+
### password_field
|
869
|
+
|
870
|
+
Our `password_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-password_field).
|
871
|
+
|
872
|
+
![password_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/594696b4-a8b4-460d-a1ed-f27bc21bcbf0)
|
873
|
+
|
874
|
+
```erb
|
875
|
+
<%= form.password_field :password %>
|
876
|
+
```
|
877
|
+
|
878
|
+
This generates the following HTML:
|
879
|
+
|
880
|
+
```html
|
881
|
+
<div class="mb-3">
|
882
|
+
<label class="form-label required" for="user_password">Password</label>
|
883
|
+
<input class="form-control" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
884
|
+
</div>
|
885
|
+
```
|
886
|
+
|
887
|
+
### phone_field
|
888
|
+
|
889
|
+
Our `phone_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-phone_field).
|
890
|
+
|
891
|
+
![phone_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/44f2acec-2a01-4715-a26e-0ff98653fbaf)
|
892
|
+
|
893
|
+
```erb
|
894
|
+
<%= form.phone_field :mobile_number %>
|
895
|
+
```
|
896
|
+
|
897
|
+
This generates the following HTML:
|
898
|
+
|
899
|
+
```html
|
900
|
+
<div class="mb-3">
|
901
|
+
<label class="form-label required" for="user_mobile_number">Mobile number</label>
|
902
|
+
<input class="form-control" aria-required="true" required="required" type="tel" name="user[mobile_number]" id="user_mobile_number">
|
903
|
+
</div>
|
904
|
+
```
|
905
|
+
|
906
|
+
### radio_button
|
907
|
+
|
908
|
+
Our `radio_button` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-radio_button).
|
909
|
+
This helper will render check box and label for you.
|
910
|
+
|
911
|
+
![radio_button](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/9afa4065-6eea-44a6-a5be-d2936d1d2f9c)
|
912
|
+
|
913
|
+
```erb
|
914
|
+
<%= form.radio_button :gender, :male, bootstrap_form: {label_text: "Male"} %>
|
915
|
+
```
|
916
|
+
|
917
|
+
This generates the following HTML:
|
918
|
+
|
919
|
+
```html
|
920
|
+
<div class="form-check mb-3">
|
921
|
+
<input class="form-check-input" type="radio" value="male" name="user[gender]" id="user_gender_male">
|
922
|
+
<label class="form-check-label" for="user_gender_male">Male</label>
|
923
|
+
</div>
|
924
|
+
```
|
925
|
+
|
926
|
+
This helper also renders help text if `help_text` option is set or information of the field is added to the locale file:
|
927
|
+
|
928
|
+
![radio_button_help_text](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/2409e822-c1bd-499b-b80f-e2948acf3403)
|
929
|
+
|
930
|
+
```erb
|
931
|
+
<%= form.radio_button :gender, :male, bootstrap_form: {label_text: "Male", help_text: "Please select your gender"} %>
|
932
|
+
```
|
933
|
+
|
934
|
+
This generates the following HTML:
|
935
|
+
|
936
|
+
```html
|
937
|
+
<div class="form-check mb-3">
|
938
|
+
<input class="form-check-input" type="radio" value="male" name="user[gender]" id="user_gender_male">
|
939
|
+
<label class="form-check-label" for="user_gender_male">Male</label>
|
940
|
+
<div class="form-text text-muted">Please select your gender</div>
|
941
|
+
</div>
|
942
|
+
```
|
943
|
+
|
944
|
+
### range_field
|
945
|
+
|
946
|
+
Our `range_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-range_field).
|
947
|
+
|
948
|
+
![range_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/7173d6fe-9b6f-4d80-8a48-37e86e025661)
|
949
|
+
|
950
|
+
```erb
|
951
|
+
<%= form.range_field :excellence %>
|
952
|
+
```
|
953
|
+
|
954
|
+
This generates the following HTML:
|
955
|
+
|
956
|
+
```html
|
957
|
+
<div class="mb-3">
|
958
|
+
<label class="form-label" for="user_excellence">Excellence</label>
|
959
|
+
<input class="form-range" type="range" name="user[excellence]" id="user_excellence">
|
960
|
+
</div>
|
961
|
+
```
|
962
|
+
|
963
|
+
### search_field
|
964
|
+
|
965
|
+
Our `search_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-search_field).
|
966
|
+
|
967
|
+
![search_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/b108c5d6-42b3-4fde-9717-dbb1cb8b8780)
|
968
|
+
|
969
|
+
```erb
|
970
|
+
<%= form.search_field :search %>
|
971
|
+
```
|
972
|
+
|
973
|
+
This generates the following HTML:
|
974
|
+
|
975
|
+
```html
|
976
|
+
<div class="mb-3">
|
977
|
+
<label class="form-label" for="user_search">Search</label>
|
978
|
+
<input class="form-control" type="search" name="user[search]" id="user_search">
|
979
|
+
</div>
|
980
|
+
```
|
981
|
+
|
982
|
+
### telephone_field
|
983
|
+
|
984
|
+
Our `telephone_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-telephone_field).
|
985
|
+
|
986
|
+
![telephone_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/0f8ded9b-4dc5-4dea-9d3e-c8850776a0d4)
|
987
|
+
|
988
|
+
```erb
|
989
|
+
<%= form.telephone_field :mobile_number %>
|
990
|
+
```
|
991
|
+
|
992
|
+
This generates the following HTML:
|
993
|
+
|
994
|
+
```html
|
995
|
+
<div class="mb-3">
|
996
|
+
<label class="form-label required" for="user_mobile_number">Mobile number</label>
|
997
|
+
<input class="form-control" aria-required="true" required="required" type="tel" name="user[mobile_number]" id="user_mobile_number">
|
998
|
+
</div>
|
999
|
+
```
|
1000
|
+
|
1001
|
+
### text_field
|
1002
|
+
|
1003
|
+
Our `text_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-text_field).
|
1004
|
+
|
1005
|
+
![text_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/88bc6eb0-53a6-4f5a-8dce-8499e6b2259d)
|
1006
|
+
|
1007
|
+
```erb
|
1008
|
+
<%= form.text_field :name %>
|
1009
|
+
```
|
1010
|
+
|
1011
|
+
This generates the following HTML:
|
1012
|
+
|
1013
|
+
```html
|
1014
|
+
<div class="mb-3">
|
1015
|
+
<label class="form-label required" for="user_name">Name</label>
|
1016
|
+
<input class="form-control" aria-required="true" required="required" type="text" name="user[name]" id="user_name">
|
1017
|
+
</div>
|
1018
|
+
```
|
1019
|
+
|
1020
|
+
### text_area
|
1021
|
+
|
1022
|
+
Our `text_area` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-text_area).
|
1023
|
+
|
1024
|
+
![text_area](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/3dad9907-4cd1-4144-a596-2471cce3739b)
|
1025
|
+
|
1026
|
+
```erb
|
1027
|
+
<%= form.text_area :street %>
|
1028
|
+
```
|
1029
|
+
|
1030
|
+
This generates the following HTML:
|
1031
|
+
|
1032
|
+
```html
|
1033
|
+
<div class="mb-3">
|
1034
|
+
<label class="form-label required" for="user_street">Street</label>
|
1035
|
+
<textarea class="form-control" aria-required="true" required="required" name="user[street]" id="user_street"></textarea>
|
1036
|
+
</div>
|
1037
|
+
```
|
1038
|
+
|
1039
|
+
### time_field
|
1040
|
+
|
1041
|
+
Our `time_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-time_field).
|
1042
|
+
|
1043
|
+
![time_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/cbf1a798-acc5-49a9-94d3-f3462f15ebc9)
|
1044
|
+
|
1045
|
+
```erb
|
1046
|
+
<%= form.time_field :interview_time %>
|
1047
|
+
```
|
1048
|
+
|
1049
|
+
This generates the following HTML:
|
1050
|
+
|
1051
|
+
```html
|
1052
|
+
<div class="mb-3">
|
1053
|
+
<label class="form-label" for="user_interview_time">Interview time</label>
|
1054
|
+
<input class="form-control" type="time" name="user[interview_time]" id="user_interview_time">
|
1055
|
+
</div>
|
1056
|
+
```
|
1057
|
+
|
1058
|
+
### url_field
|
1059
|
+
|
1060
|
+
Our `url_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-url_field).
|
1061
|
+
|
1062
|
+
![url_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/dfb8a3ab-a1b2-4ce8-a10b-619b3fb1a268)
|
1063
|
+
|
1064
|
+
```erb
|
1065
|
+
<%= form.url_field :blog_url %>
|
1066
|
+
```
|
1067
|
+
|
1068
|
+
This generates the following HTML:
|
1069
|
+
|
1070
|
+
```html
|
1071
|
+
<div class="mb-3">
|
1072
|
+
<label class="form-label" for="user_blog_url">Blog URL</label>
|
1073
|
+
<input class="form-control" type="url" name="user[blog_url]" id="user_blog_url">
|
1074
|
+
</div>
|
1075
|
+
```
|
1076
|
+
|
1077
|
+
### week_field
|
1078
|
+
|
1079
|
+
Our `week_field` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-week_field).
|
1080
|
+
|
1081
|
+
![week_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/609d0c59-c5ff-497c-8461-fc289ab06d6f)
|
1082
|
+
|
1083
|
+
```erb
|
1084
|
+
<%= form.week_field :winter_holiday_week %>
|
1085
|
+
```
|
1086
|
+
|
1087
|
+
This generates the following HTML:
|
1088
|
+
|
1089
|
+
```html
|
1090
|
+
<div class="mb-3">
|
1091
|
+
<label class="form-label" for="user_winter_holiday_week">Winter holiday week</label>
|
1092
|
+
<input class="form-control" type="week" name="user[winter_holiday_week]" id="user_winter_holiday_week">
|
1093
|
+
</div>
|
1094
|
+
```
|
1095
|
+
|
1096
|
+
## Form Options Helpers
|
1097
|
+
|
1098
|
+
Our form options helpers accept the same arguments as the default Rails form options helpers.
|
1099
|
+
In order to apply addition options of `rails_bootstrap_form`, `bootstrap_form` object is passed in `options` argument of the helper.
|
1100
|
+
Here's an example of how you pass the arguments for each form option helper:
|
1101
|
+
|
1102
|
+
### select
|
1103
|
+
|
1104
|
+
Our `select` helper accepts the same arguments as the [default Rails helper](http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select).
|
1105
|
+
Here's an example of how you pass both options and html_options hashes:
|
1106
|
+
|
1107
|
+
![select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/e21f092c-d439-4817-bba1-8ec0c21330c1)
|
1108
|
+
|
1109
|
+
```erb
|
1110
|
+
<%= form.select :fruit_id, options_for_select(::Fruit.pluck(:name, :id), form.object.fruit_id), {include_blank: "Select fruit", bootstrap_form: {size: :sm, help_text: false}}, {onchange: "this.form.submit();"} %>
|
1111
|
+
```
|
1112
|
+
|
1113
|
+
This generates the following HTML:
|
1114
|
+
|
1115
|
+
```html
|
1116
|
+
<div class="mb-3">
|
1117
|
+
<label class="form-label required" for="user_fruit_id">Favorite fruit</label>
|
1118
|
+
<select onchange="this.form.submit();" class="form-select" aria-required="true" required="required" name="user[fruit_id]" id="user_fruit_id">
|
1119
|
+
<option value="">Select fruit</option>
|
1120
|
+
<option value="1">Mango</option>
|
1121
|
+
<option value="2">Apple</option>
|
1122
|
+
<option value="3">Orange</option>
|
1123
|
+
<option value="4">Watermelon</option>
|
1124
|
+
</select>
|
1125
|
+
</div>
|
1126
|
+
```
|
1127
|
+
|
1128
|
+
### collection_select
|
1129
|
+
|
1130
|
+
Our `collection_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select).
|
1131
|
+
Here's an example of how you pass both options and html_options hashes:
|
1132
|
+
|
1133
|
+
![collection_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/c3a24265-81a9-4d1b-aa01-2b066d2f8bc7)
|
1134
|
+
|
1135
|
+
```erb
|
1136
|
+
<%= form.collection_select :fruit_id, ::Fruit.all, :id, :name, {include_blank: "Select fruit", bootstrap_form: {help_text: false}}, {selected: form.object.fruit_id, onchange: "this.form.submit();"} %>
|
1137
|
+
```
|
1138
|
+
|
1139
|
+
This generates the following HTML:
|
1140
|
+
|
1141
|
+
```html
|
1142
|
+
<div class="mb-3">
|
1143
|
+
<label class="form-label required" for="user_fruit_id">Favorite fruit</label>
|
1144
|
+
<select onchange="this.form.submit();" class="form-select" aria-required="true" required="required" name="user[fruit_id]" id="user_fruit_id">
|
1145
|
+
<option value="">Select fruit</option>
|
1146
|
+
<option value="1">Mango</option>
|
1147
|
+
<option value="2">Apple</option>
|
1148
|
+
<option value="3">Orange</option>
|
1149
|
+
<option value="4">Watermelon</option>
|
1150
|
+
</select>
|
1151
|
+
</div>
|
1152
|
+
```
|
1153
|
+
|
1154
|
+
### grouped_collection_select
|
1155
|
+
|
1156
|
+
Our `grouped_collection_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-grouped_collection_select).
|
1157
|
+
Here's an example of how you pass both options and html_options hashes:
|
1158
|
+
|
1159
|
+
![grouped_collection_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/d8f90065-3aa8-4d52-9c3e-0486324b3624)
|
1160
|
+
|
1161
|
+
```erb
|
1162
|
+
<%= form.grouped_collection_select :city, ::Country.includes(:cities), :cities, :name, :id, :name, {include_blank: "Select city", bootstrap_form: {floating: true}}, {onchange: "this.form.submit();"} %>
|
1163
|
+
```
|
1164
|
+
|
1165
|
+
This generates the following HTML:
|
1166
|
+
|
1167
|
+
```html
|
1168
|
+
<div class="mb-3">
|
1169
|
+
<div class="form-floating">
|
1170
|
+
<select onchange="this.form.submit();" class="form-select" aria-required="true" required="required" placeholder="City" name="user[city]" id="user_city">
|
1171
|
+
<option value="">Select city</option>
|
1172
|
+
<optgroup label="India">
|
1173
|
+
<option value="1">Mumbai</option>
|
1174
|
+
<option value="2">New Delhi</option>
|
1175
|
+
<option value="3">Kolkata</option>
|
1176
|
+
<option value="4">Chennai</option>
|
1177
|
+
</optgroup>
|
1178
|
+
<optgroup label="Ireland">
|
1179
|
+
<option value="5">Dublin</option>
|
1180
|
+
<option value="6">Galway</option>
|
1181
|
+
<option value="7">Cork</option>
|
1182
|
+
<option value="8">Belfast</option>
|
1183
|
+
</optgroup>
|
1184
|
+
<optgroup label="United States">
|
1185
|
+
<option value="9">New York</option>
|
1186
|
+
<option value="10">Los Angeles</option>
|
1187
|
+
<option value="11">San Francisco</option>
|
1188
|
+
<option value="12">Chicago</option>
|
1189
|
+
</optgroup>
|
1190
|
+
...
|
1191
|
+
...
|
1192
|
+
</select>
|
1193
|
+
<label class="form-label required" for="user_city">City</label>
|
1194
|
+
</div>
|
1195
|
+
</div>
|
1196
|
+
```
|
1197
|
+
|
1198
|
+
### time_zone_select
|
1199
|
+
|
1200
|
+
Our `time_zone_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-time_zone_select).
|
1201
|
+
Here's an example of how you pass both options and html_options hashes:
|
1202
|
+
|
1203
|
+
![time_zone_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/e161585c-1bbf-485c-9baf-c57b15258fe8)
|
1204
|
+
|
1205
|
+
```erb
|
1206
|
+
<%= form.time_zone_select :timezone, ::ActiveSupport::TimeZone.all, {include_blank: "Select time zone", bootstrap_form: {label_text: "Preferred time zone"}}, {onchange: "this.form.submit();"} %>
|
1207
|
+
```
|
1208
|
+
|
1209
|
+
This generates the following HTML:
|
1210
|
+
|
1211
|
+
```html
|
1212
|
+
<div class="mb-3">
|
1213
|
+
<label class="form-label" for="user_timezone">Preferred time zone</label>
|
1214
|
+
<select onchange="this.form.submit();" class="form-select" name="user[timezone]" id="user_timezone">
|
1215
|
+
<option value="">Select time zone</option>
|
1216
|
+
<option value="International Date Line West">(GMT-12:00) International Date Line West</option>
|
1217
|
+
<option value="American Samoa">(GMT-11:00) American Samoa</option>
|
1218
|
+
<option value="Midway Island">(GMT-11:00) Midway Island</option>
|
1219
|
+
<option value="Hawaii">(GMT-10:00) Hawaii</option>
|
1220
|
+
<option value="Alaska">(GMT-09:00) Alaska</option>
|
1221
|
+
<option value="Pacific Time (US & Canada)">(GMT-08:00) Pacific Time (US & Canada)</option>
|
1222
|
+
<option value="Tijuana">(GMT-08:00) Tijuana</option>
|
1223
|
+
<option value="Arizona">(GMT-07:00) Arizona</option>
|
1224
|
+
...
|
1225
|
+
...
|
1226
|
+
</select>
|
1227
|
+
</div>
|
1228
|
+
```
|
1229
|
+
|
1230
|
+
### weekday_select
|
1231
|
+
|
1232
|
+
Our `weekday_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-weekday_select).
|
1233
|
+
Here's an example of how you pass both options and html_options hashes:
|
1234
|
+
|
1235
|
+
![weekday_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/e469a57d-3d22-4c9e-829b-4ba825593ae1)
|
1236
|
+
|
1237
|
+
```erb
|
1238
|
+
<%= form.weekday_select :weekly_off, {selected: "Monday", bootstrap_form: {label_text: "Week off"}}, {onchange: "this.form.submit();} %>
|
1239
|
+
```
|
1240
|
+
|
1241
|
+
This generates the following HTML:
|
1242
|
+
|
1243
|
+
```html
|
1244
|
+
<div class="mb-3">
|
1245
|
+
<label class="form-label" for="user_weekly_off">Week off</label>
|
1246
|
+
<select onchange="this.form.submit();" class="form-select" name="user[weekly_off]" id="user_weekly_off">
|
1247
|
+
<option selected="selected" value="Monday">Monday</option>
|
1248
|
+
<option value="Tuesday">Tuesday</option>
|
1249
|
+
<option value="Wednesday">Wednesday</option>
|
1250
|
+
<option value="Thursday">Thursday</option>
|
1251
|
+
<option value="Friday">Friday</option>
|
1252
|
+
<option value="Saturday">Saturday</option>
|
1253
|
+
<option value="Sunday">Sunday</option>
|
1254
|
+
</select>
|
1255
|
+
</div>
|
1256
|
+
```
|
1257
|
+
|
1258
|
+
### collection_check_boxes
|
1259
|
+
|
1260
|
+
This helper provides a way to create collection of check boxes. This helper accepts same arguments as [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_check_boxes) except it don't accept a block as
|
1261
|
+
an argument and takes care of rendering labels, check boxes, and wrapper for you.
|
1262
|
+
|
1263
|
+
![collection_check_boxes](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/c92f5921-e572-4384-812e-31308e018f66)
|
1264
|
+
|
1265
|
+
```erb
|
1266
|
+
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap_form: {layout: :horizontal}, onchange: "this.form.submit();"}, {} %>
|
1267
|
+
```
|
1268
|
+
|
1269
|
+
This generates the following HTML:
|
1270
|
+
|
1271
|
+
```html
|
1272
|
+
<div class="row mb-3">
|
1273
|
+
<label class="col-form-label col-sm-2 required" for="user_skill_ids">Skills</label>
|
1274
|
+
<div class="col-sm-10">
|
1275
|
+
<div class="rails-bootstrap-forms-collection-check-boxes">
|
1276
|
+
<input value="" multiple="multiple" autocomplete="off" type="hidden" name="user[skill_ids][]" id="user_skill_ids">
|
1277
|
+
<div class="form-check form-check-inline">
|
1278
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="1" name="user[skill_ids][]" id="user_skill_ids_1">
|
1279
|
+
<label class="form-check-label" for="user_skill_ids_1">Communication</label>
|
1280
|
+
</div>
|
1281
|
+
<div class="form-check form-check-inline">
|
1282
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="2" name="user[skill_ids][]" id="user_skill_ids_2">
|
1283
|
+
<label class="form-check-label" for="user_skill_ids_2">Problem Solving</label>
|
1284
|
+
</div>
|
1285
|
+
<div class="form-check form-check-inline">
|
1286
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="3" name="user[skill_ids][]" id="user_skill_ids_3">
|
1287
|
+
<label class="form-check-label" for="user_skill_ids_3">Leadership</label>
|
1288
|
+
</div>
|
1289
|
+
<div class="form-check form-check-inline">
|
1290
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="4" name="user[skill_ids][]" id="user_skill_ids_4">
|
1291
|
+
<label class="form-check-label" for="user_skill_ids_4">Writing</label>
|
1292
|
+
</div>
|
1293
|
+
<div class="form-check form-check-inline">
|
1294
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="5" name="user[skill_ids][]" id="user_skill_ids_5">
|
1295
|
+
<label class="form-check-label" for="user_skill_ids_5">Creativity</label>
|
1296
|
+
</div>
|
1297
|
+
<div class="form-check form-check-inline">
|
1298
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="6" name="user[skill_ids][]" id="user_skill_ids_6">
|
1299
|
+
<label class="form-check-label" for="user_skill_ids_6">Time Management</label>
|
1300
|
+
</div>
|
1301
|
+
<div class="form-check form-check-inline">
|
1302
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="7" name="user[skill_ids][]" id="user_skill_ids_7">
|
1303
|
+
<label class="form-check-label" for="user_skill_ids_7">Team Work</label>
|
1304
|
+
</div>
|
1305
|
+
<div class="form-check form-check-inline">
|
1306
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="8" name="user[skill_ids][]" id="user_skill_ids_8">
|
1307
|
+
<label class="form-check-label" for="user_skill_ids_8">Negotiation</label>
|
1308
|
+
</div>
|
1309
|
+
<div class="form-check form-check-inline">
|
1310
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="9" name="user[skill_ids][]" id="user_skill_ids_9">
|
1311
|
+
<label class="form-check-label" for="user_skill_ids_9">Decision Making</label>
|
1312
|
+
</div>
|
1313
|
+
<div class="form-check form-check-inline">
|
1314
|
+
<input onchange="this.form.submit();" class="form-check-input" type="checkbox" value="10" name="user[skill_ids][]" id="user_skill_ids_10">
|
1315
|
+
<label class="form-check-label" for="user_skill_ids_10">Management</label>
|
1316
|
+
</div>
|
1317
|
+
</div>
|
1318
|
+
<div class="form-text text-muted">Select your strong skills</div>
|
1319
|
+
</div>
|
1320
|
+
</div>
|
1321
|
+
```
|
1322
|
+
|
1323
|
+
### collection_radio_buttons
|
1324
|
+
|
1325
|
+
This helper provides a way to create collection of radio buttons. This helper accepts same arguments as [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_radio_buttons) except it don't accept a block as
|
1326
|
+
an argument and takes care of rendering labels, radio button, and wrapper for you.
|
1327
|
+
|
1328
|
+
![collection_radio_buttons](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/798a8b0c-915a-40b1-9874-dd74f50d3695)
|
1329
|
+
|
1330
|
+
```erb
|
1331
|
+
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id, bootstrap_form: {layout: :horizontal}}, {} %>
|
1332
|
+
```
|
1333
|
+
|
1334
|
+
This generates the following HTML:
|
1335
|
+
|
1336
|
+
```html
|
1337
|
+
<div class="row mb-3">
|
1338
|
+
<label class="col-form-label col-sm-2 required" for="user_fruit_id">Favorite fruit</label>
|
1339
|
+
<div class="col-sm-10">
|
1340
|
+
<div class="rails-bootstrap-forms-collection-radio-buttons">
|
1341
|
+
<div class="form-check form-check-inline">
|
1342
|
+
<input class="form-check-input" type="radio" value="1" name="user[fruit_id]" id="user_fruit_id_1">
|
1343
|
+
<label class="form-check-label" for="user_fruit_id_1">Mango</label>
|
1344
|
+
</div>
|
1345
|
+
<div class="form-check form-check-inline">
|
1346
|
+
<input class="form-check-input" type="radio" value="2" name="user[fruit_id]" id="user_fruit_id_2">
|
1347
|
+
<label class="form-check-label" for="user_fruit_id_2">Apple</label>
|
1348
|
+
</div>
|
1349
|
+
<div class="form-check form-check-inline">
|
1350
|
+
<input class="form-check-input" type="radio" value="3" name="user[fruit_id]" id="user_fruit_id_3">
|
1351
|
+
<label class="form-check-label" for="user_fruit_id_3">Orange</label>
|
1352
|
+
</div>
|
1353
|
+
<div class="form-check form-check-inline">
|
1354
|
+
<input class="form-check-input" type="radio" value="4" name="user[fruit_id]" id="user_fruit_id_4">
|
1355
|
+
<label class="form-check-label" for="user_fruit_id_4">Watermelon</label>
|
1356
|
+
</div>
|
1357
|
+
</div>
|
1358
|
+
<div class="form-text text-muted">Select your favorite fruit</div>
|
1359
|
+
</div>
|
1360
|
+
</div>
|
1361
|
+
```
|
1362
|
+
|
1363
|
+
## Date Helpers
|
1364
|
+
|
1365
|
+
The multiple selects that the date and time helpers (`date_select`, `time_select`, `datetime_select`) generate are wrapped inside a `fieldset.rails-bootstrap-forms-[date|time|datetime]-select` tag.
|
1366
|
+
This is because Bootstrap automatically styles our controls as blocks. This wrapper fixes this defining these selects as `inline-block` and a width of `auto`.
|
1367
|
+
In order to apply addition options of `rails_bootstrap_form`, `bootstrap_form` object is passed in `options` argument of the helper.
|
1368
|
+
|
1369
|
+
### date_select
|
1370
|
+
|
1371
|
+
Our `date_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select).
|
1372
|
+
Here's an example of how you pass both options and html_options hashes:
|
1373
|
+
|
1374
|
+
![date_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/45fe5d72-43da-498e-a1c2-ac6729446bba)
|
1375
|
+
|
1376
|
+
```erb
|
1377
|
+
<%= form.date_select :interview_date, {selected: form.object.interview_date, bootstrap_form: {label_text: "Choose interview date"}}, {onchange: "this.form.submit();"} %>
|
1378
|
+
```
|
1379
|
+
|
1380
|
+
This generates the following HTML:
|
1381
|
+
|
1382
|
+
```html
|
1383
|
+
<div class="mb-3">
|
1384
|
+
<label class="form-label" for="user_interview_date">Choose interview date</label>
|
1385
|
+
<fieldset class="rails-bootstrap-forms-date-select">
|
1386
|
+
<select id="user_interview_date_1i" name="user[interview_date(1i)]" onchange="this.form.submit();" class="form-select">
|
1387
|
+
<option value="2018">2018</option>
|
1388
|
+
<option value="2019">2019</option>
|
1389
|
+
<option value="2020">2020</option>
|
1390
|
+
<option value="2021">2021</option>
|
1391
|
+
<option value="2022">2022</option>
|
1392
|
+
<option value="2023" selected="selected">2023</option>
|
1393
|
+
...
|
1394
|
+
...
|
1395
|
+
</select>
|
1396
|
+
<select id="user_interview_date_2i" name="user[interview_date(2i)]" onchange="this.form.submit();" class="form-select">
|
1397
|
+
<option value="1">January</option>
|
1398
|
+
<option value="2">February</option>
|
1399
|
+
<option value="3">March</option>
|
1400
|
+
<option value="4">April</option>
|
1401
|
+
<option value="5" selected="selected">May</option>
|
1402
|
+
...
|
1403
|
+
...
|
1404
|
+
</select>
|
1405
|
+
<select id="user_interview_date_3i" name="user[interview_date(3i)]" onchange="this.form.submit();" class="form-select">
|
1406
|
+
<option value="1">1</option>
|
1407
|
+
<option value="2">2</option>
|
1408
|
+
<option value="3">3</option>
|
1409
|
+
<option value="4">4</option>
|
1410
|
+
<option value="5">5</option>
|
1411
|
+
<option value="6">6</option>
|
1412
|
+
<option value="7">7</option>
|
1413
|
+
<option value="8" selected="selected">8</option>
|
1414
|
+
...
|
1415
|
+
...
|
1416
|
+
</select>
|
1417
|
+
</fieldset>
|
1418
|
+
</div>
|
1419
|
+
```
|
1420
|
+
|
1421
|
+
### time_select
|
1422
|
+
|
1423
|
+
Our `time_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_select).
|
1424
|
+
Here's an example of how you pass both options and html_options hashes:
|
1425
|
+
|
1426
|
+
![time_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/2195922c-c7cc-48dc-9912-3ef3cbb8e017)
|
1427
|
+
|
1428
|
+
```erb
|
1429
|
+
<%= form.time_select :interview_time, {selected: form.object.interview_time, bootstrap_form: {label_text: "Choose interview time"}}, {onchange: "this.form.submit();"} %>
|
1430
|
+
```
|
1431
|
+
|
1432
|
+
This generates the following HTML:
|
1433
|
+
|
1434
|
+
```html
|
1435
|
+
<div class="mb-3">
|
1436
|
+
<label class="form-label" for="user_interview_time">Choose interview time</label>
|
1437
|
+
<fieldset class="rails-bootstrap-forms-time-select">
|
1438
|
+
<input type="hidden" id="user_interview_time_1i" name="user[interview_time(1i)]" value="1" autocomplete="off">
|
1439
|
+
<input type="hidden" id="user_interview_time_2i" name="user[interview_time(2i)]" value="1" autocomplete="off">
|
1440
|
+
<input type="hidden" id="user_interview_time_3i" name="user[interview_time(3i)]" value="1" autocomplete="off">
|
1441
|
+
<select id="user_interview_time_4i" name="user[interview_time(4i)]" onchange="this.form.submit();" class="form-select">
|
1442
|
+
<option value="00">00</option>
|
1443
|
+
<option value="01">01</option>
|
1444
|
+
<option value="02">02</option>
|
1445
|
+
<option value="03">03</option>
|
1446
|
+
<option value="04">04</option>
|
1447
|
+
...
|
1448
|
+
...
|
1449
|
+
</select>
|
1450
|
+
:
|
1451
|
+
<select id="user_interview_time_5i" name="user[interview_time(5i)]" onchange="this.form.submit();" class="form-select">
|
1452
|
+
<option value="00">00</option>
|
1453
|
+
<option value="01">01</option>
|
1454
|
+
<option value="02">02</option>
|
1455
|
+
<option value="03">03</option>
|
1456
|
+
<option value="04">04</option>
|
1457
|
+
<option value="05">05</option>
|
1458
|
+
...
|
1459
|
+
...
|
1460
|
+
</select>
|
1461
|
+
</fieldset>
|
1462
|
+
</div>
|
1463
|
+
```
|
1464
|
+
|
1465
|
+
### datetime_select
|
1466
|
+
|
1467
|
+
Our `datetime_select` helper accepts the same arguments as the [default Rails helper](https://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-datetime_select).
|
1468
|
+
Here's an example of how you pass both options and html_options hashes:
|
1469
|
+
|
1470
|
+
![datetime_select](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/c0e0cd83-d44a-4308-bfa9-e25a2a488d66)
|
1471
|
+
|
1472
|
+
```erb
|
1473
|
+
<%= form.datetime_select :interview_datetime, {selected: form.object.interview_datetime, bootstrap_form: {label_text: "Choose interview date & time"}}, {onchange: "this.form.submit();"} %>
|
1474
|
+
```
|
1475
|
+
|
1476
|
+
This generates the following HTML:
|
1477
|
+
|
1478
|
+
```html
|
1479
|
+
<div class="mb-3">
|
1480
|
+
<label class="form-label" for="user_interview_datetime">Choose interview date & time</label>
|
1481
|
+
<fieldset class="rails-bootstrap-forms-datetime-select">
|
1482
|
+
<select id="user_interview_datetime_1i" name="user[interview_datetime(1i)]" onchange="this.form.submit();" class="form-select">
|
1483
|
+
<option value="2018">2018</option>
|
1484
|
+
<option value="2019">2019</option>
|
1485
|
+
<option value="2020">2020</option>
|
1486
|
+
<option value="2021">2021</option>
|
1487
|
+
...
|
1488
|
+
...
|
1489
|
+
</select>
|
1490
|
+
<select id="user_interview_datetime_2i" name="user[interview_datetime(2i)]" onchange="this.form.submit();" class="form-select">
|
1491
|
+
<option value="1">January</option>
|
1492
|
+
<option value="2">February</option>
|
1493
|
+
<option value="3">March</option>
|
1494
|
+
<option value="4">April</option>
|
1495
|
+
...
|
1496
|
+
...
|
1497
|
+
</select>
|
1498
|
+
<select id="user_interview_datetime_3i" name="user[interview_datetime(3i)]" onchange="this.form.submit();" class="form-select">
|
1499
|
+
<option value="1">1</option>
|
1500
|
+
<option value="2">2</option>
|
1501
|
+
<option value="3">3</option>
|
1502
|
+
<option value="4">4</option>
|
1503
|
+
<option value="5">5</option>
|
1504
|
+
<option value="6">6</option>
|
1505
|
+
...
|
1506
|
+
...
|
1507
|
+
</select>
|
1508
|
+
—
|
1509
|
+
<select id="user_interview_datetime_4i" name="user[interview_datetime(4i)]" onchange="this.form.submit();" class="form-select">
|
1510
|
+
<option value="00">00</option>
|
1511
|
+
<option value="01">01</option>
|
1512
|
+
<option value="02">02</option>
|
1513
|
+
<option value="03">03</option>
|
1514
|
+
<option value="04">04</option>
|
1515
|
+
...
|
1516
|
+
...
|
1517
|
+
</select>
|
1518
|
+
:
|
1519
|
+
<select id="user_interview_datetime_5i" name="user[interview_datetime(5i)]" onchange="this.form.submit();" class="form-select">
|
1520
|
+
<option value="00">00</option>
|
1521
|
+
<option value="01">01</option>
|
1522
|
+
<option value="02">02</option>
|
1523
|
+
<option value="03">03</option>
|
1524
|
+
<option value="04">04</option>
|
1525
|
+
...
|
1526
|
+
...
|
1527
|
+
</select>
|
1528
|
+
</fieldset>
|
1529
|
+
</div>
|
1530
|
+
```
|
1531
|
+
|
1532
|
+
## Submit Buttons
|
1533
|
+
|
1534
|
+
`rails_bootstrap_form` allows to easily create submit button for the form. `rails_bootstrap_form` supports three color variants for submit buttons: `secondary`, `primary`, and `danger`. Submit buttons are supported in `vertical`, `horizontal`, and `inline` layout.
|
1535
|
+
Submit buttons in inline form are wrapped inside `div.col-12` to properly render on small width devices.
|
1536
|
+
|
1537
|
+
![button_helpers](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/f41a013b-b8c9-4689-a079-b8b102084cf0)
|
1538
|
+
|
1539
|
+
```erb
|
1540
|
+
<%= form.secondary "Search" %>
|
1541
|
+
<%= form.primary "Register" %>
|
1542
|
+
<%= form.danger "Delete" %>
|
1543
|
+
```
|
1544
|
+
|
1545
|
+
This generates the following HTML:
|
1546
|
+
|
1547
|
+
```html
|
1548
|
+
<input type="submit" name="commit" value="Search" class="btn btn-secondary" data-disable-with="Search">
|
1549
|
+
<input type="submit" name="commit" value="Register" class="btn btn-primary" data-disable-with="Register">
|
1550
|
+
<input type="submit" name="commit" value="Delete" class="btn btn-danger" data-disable-with="Delete">
|
1551
|
+
```
|
1552
|
+
|
1553
|
+
It is also possible to pass additional classes to the button helpers using HTML `class` attribute and that class will be
|
1554
|
+
added along with default class of the submit helper.
|
1555
|
+
|
1556
|
+
![button_additional_class](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/d9493c36-5c18-4e2a-bb36-e8a947c16bfe)
|
1557
|
+
|
1558
|
+
```erb
|
1559
|
+
<%= form.primary "Register", class: "register-button" %>
|
1560
|
+
```
|
1561
|
+
|
1562
|
+
This generates the following HTML:
|
1563
|
+
|
1564
|
+
```html
|
1565
|
+
<input type="submit" name="commit" value="Register" class="register-button btn btn-primary" data-disable-with="Register">
|
1566
|
+
```
|
1567
|
+
|
1568
|
+
To render submit helper as a button helper, you can set `render_as_button` option to `true` or pass a block.
|
1569
|
+
|
1570
|
+
![render_as_button](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/dffd72d8-3acf-4029-be04-3bf7776e8d9c)
|
1571
|
+
|
1572
|
+
```erb
|
1573
|
+
<%= form.primary "Register", bootstrap_form: {render_as_button: true} %>
|
1574
|
+
<%= form.secondary do %>
|
1575
|
+
Sign in
|
1576
|
+
<% end %>
|
1577
|
+
```
|
1578
|
+
|
1579
|
+
This generates the following HTML:
|
1580
|
+
|
1581
|
+
```html
|
1582
|
+
<button name="button" type="submit" class="btn btn-primary">Register</button>
|
1583
|
+
<button name="button" type="submit" class="btn btn-secondary">
|
1584
|
+
Sign in
|
1585
|
+
</button>
|
1586
|
+
```
|
1587
|
+
|
1588
|
+
## Static controls
|
1589
|
+
|
1590
|
+
`rails_bootstrap_form` provides form helper `static_field` to render static controls which internally uses [text_field](#text_field) form helper.
|
1591
|
+
It sets `readonly` and `disabled` attributes on the text field. By default, `static_field` applies `form-control-plaintext`
|
1592
|
+
CSS class to the control but you can change it by using option `static_field_class`.
|
1593
|
+
|
1594
|
+
You can create a static controls like this:
|
1595
|
+
|
1596
|
+
![static_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/cb7cc64f-c405-4abb-8ca9-66fe4c2fff98)
|
1597
|
+
|
1598
|
+
```erb
|
1599
|
+
<%= form.static_field :email %>
|
1600
|
+
```
|
1601
|
+
|
1602
|
+
This generates the following HTML:
|
1603
|
+
|
1604
|
+
```html
|
1605
|
+
<div class="mb-3">
|
1606
|
+
<label class="form-label required" for="user_email">Email address</label>
|
1607
|
+
<input readonly="readonly" disabled="disabled" value="test@example.com" class="form-control-plaintext" aria-required="true" required="required" type="text" name="user[email]" id="user_email">
|
1608
|
+
</div>
|
1609
|
+
```
|
1610
|
+
|
1611
|
+
## Floating Labels
|
1612
|
+
|
1613
|
+
The `floating` option can be used to enable Bootstrap floating labels. This option is supported on text fields, text areas and dropdowns. Here's an example:
|
1614
|
+
|
1615
|
+
![floating_labels](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/3976629d-4717-47b0-ab91-9a16e6c9ed5f)
|
1616
|
+
|
1617
|
+
```erb
|
1618
|
+
<%= bootstrap_form_for @user, bootstrap_form: {floating: true} do |form| %>
|
1619
|
+
<%= form.text_field :name %>
|
1620
|
+
<%= form.email_field :username %>
|
1621
|
+
<%= form.password_field :password %>
|
1622
|
+
<%= form.fields_for :address, include_id: false do |address_form| %>
|
1623
|
+
<%= address_form.text_area :street %>
|
1624
|
+
<%= address_form.select :country_id, options_for_select(::Country.pluck(:name, :id), address_form.object.country_id),
|
1625
|
+
{include_blank: "Select Country"} %>
|
1626
|
+
<% end %>
|
1627
|
+
<%= form.primary "Register" %>
|
1628
|
+
<% end %>
|
1629
|
+
```
|
1630
|
+
|
1631
|
+
This generates the following HTML:
|
1632
|
+
|
1633
|
+
```html
|
1634
|
+
<form role="form" novalidate="novalidate" class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
|
1635
|
+
<div class="mb-3">
|
1636
|
+
<div class="form-floating">
|
1637
|
+
<input class="form-control" aria-required="true" required="required" placeholder="Name" type="text" name="user[name]" id="user_name">
|
1638
|
+
<label class="form-label required" for="user_name">Name</label>
|
1639
|
+
</div>
|
1640
|
+
</div>
|
1641
|
+
<div class="mb-3">
|
1642
|
+
<div class="form-floating">
|
1643
|
+
<input class="form-control" placeholder="Username" type="email" name="user[username]" id="user_username">
|
1644
|
+
<label class="form-label" for="user_username">Username</label>
|
1645
|
+
</div>
|
1646
|
+
</div>
|
1647
|
+
<div class="mb-3">
|
1648
|
+
<div class="form-floating">
|
1649
|
+
<input class="form-control" aria-required="true" required="required" placeholder="Password" type="password" name="user[password]" id="user_password">
|
1650
|
+
<label class="form-label required" for="user_password">Password</label>
|
1651
|
+
</div>
|
1652
|
+
</div>
|
1653
|
+
<div class="mb-3">
|
1654
|
+
<div class="form-floating">
|
1655
|
+
<textarea class="form-control" aria-required="true" required="required" placeholder="Street" name="user[address_attributes][street]" id="user_address_attributes_street"></textarea>
|
1656
|
+
<label class="form-label required" for="user_address_attributes_street">Street</label>
|
1657
|
+
</div>
|
1658
|
+
</div>
|
1659
|
+
<div class="mb-3">
|
1660
|
+
<div class="form-floating">
|
1661
|
+
<select class="form-select" aria-required="true" required="required" placeholder="Country" name="user[address_attributes][country_id]" id="user_address_attributes_country_id">
|
1662
|
+
<option value="">Select Country</option>
|
1663
|
+
<option value="1">India</option>
|
1664
|
+
<option value="2">Ireland</option>
|
1665
|
+
<option value="3">United States</option>
|
1666
|
+
<option value="4">United Kingdom</option>
|
1667
|
+
</select>
|
1668
|
+
<label class="form-label required" for="user_address_attributes_country_id">Country</label>
|
1669
|
+
</div>
|
1670
|
+
</div>
|
1671
|
+
<input type="submit" name="commit" value="Register" class="btn btn-primary" data-disable-with="Register">
|
1672
|
+
</form>
|
1673
|
+
```
|
1674
|
+
|
1675
|
+
## Validation and Errors
|
1676
|
+
|
1677
|
+
By default, `rails_bootstrap_form` generations in-line errors which appear below the field.
|
1678
|
+
|
1679
|
+
### Inline Errors
|
1680
|
+
|
1681
|
+
By default, fields that have validation errors will be outlined in red and the error will be displayed below the field. Here's an example:
|
1682
|
+
|
1683
|
+
![inline_errors](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/a1cef10d-ba21-4d97-97e7-919691e2afe3)
|
1684
|
+
|
1685
|
+
```erb
|
1686
|
+
<%= bootstrap_form_for @user do |form| %>
|
1687
|
+
<%= form.email_field :email %>
|
1688
|
+
<%= form.password_field :password %>
|
1689
|
+
<%= form.primary "Register" %>
|
1690
|
+
<% end %>
|
1691
|
+
```
|
1692
|
+
|
1693
|
+
This generates the following HTML:
|
1694
|
+
|
1695
|
+
```html
|
1696
|
+
<form role="form" novalidate="novalidate" class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
|
1697
|
+
<div class="mb-3">
|
1698
|
+
<label class="form-label required is-invalid" for="user_email">Email address</label>
|
1699
|
+
<input class="form-control is-invalid" aria-required="true" required="required" type="email" name="user[email]" id="user_email">
|
1700
|
+
<div class="invalid-feedback">can't be blank</div>
|
1701
|
+
<div class="form-text text-muted">Please use official email address</div>
|
1702
|
+
</div>
|
1703
|
+
<div class="mb-3">
|
1704
|
+
<label class="form-label required is-invalid" for="user_password">Password</label>
|
1705
|
+
<input class="form-control is-invalid" aria-required="true" required="required" type="password" name="user[password]" id="user_password">
|
1706
|
+
<div class="invalid-feedback">can't be blank</div>
|
1707
|
+
</div>
|
1708
|
+
<input type="submit" name="commit" value="Register" class="btn btn-primary" data-disable-with="Register">
|
1709
|
+
</form>
|
1710
|
+
```
|
1711
|
+
|
1712
|
+
## Required Fields
|
1713
|
+
|
1714
|
+
A label that is associated with a mandatory field is automatically annotated with a `required` CSS class. `rails_bootstrap_form` provides styling for required fields.
|
1715
|
+
You're also free to add any appropriate CSS to style required fields as desired.
|
1716
|
+
|
1717
|
+
The label `required` class is determined based on the definition of a presence validator with the associated model attribute. Presently this is one of: `ActiveRecord::Validations::PresenceValidator` or `ActiveModel::Validations::PresenceValidator`.
|
1718
|
+
|
1719
|
+
In cases where this behaviour is undesirable, use the required option to force the class to be present or absent:
|
1720
|
+
|
1721
|
+
![required_field](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/d99043f0-c382-4597-81bb-e96f27033e65)
|
1722
|
+
|
1723
|
+
```
|
1724
|
+
<%= form.date_field :birth_date, required: false %>
|
1725
|
+
<%= form.url_field :blog_url, required: true %>
|
1726
|
+
```
|
1727
|
+
|
1728
|
+
This generates the following HTML:
|
1729
|
+
|
1730
|
+
```html
|
1731
|
+
<div class="mb-3">
|
1732
|
+
<label class="form-label" for="user_birth_date">Birth date</label>
|
1733
|
+
<input class="form-control" type="date" name="user[birth_date]" id="user_birth_date">
|
1734
|
+
</div>
|
1735
|
+
<div class="mb-3">
|
1736
|
+
<label class="form-label required" for="user_blog_url">Blog URL</label>
|
1737
|
+
<input required="required" class="form-control" aria-required="true" type="url" name="user[blog_url]" id="user_blog_url">
|
1738
|
+
</div>
|
1739
|
+
```
|
1740
|
+
|
1741
|
+
### Required `belongs_to` associations
|
1742
|
+
|
1743
|
+
Adding a form control for a `belongs_to` associated field will automatically pick up the associated presence validator.
|
1744
|
+
|
1745
|
+
![belongs_to_presence](https://github.com/shivam091/rails_bootstrap_form/assets/7858927/feb279d8-a742-42c2-b13d-8e5a0f60dfa2)
|
1746
|
+
|
1747
|
+
```erb
|
1748
|
+
<%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {checked: form.object.fruit_id} %>
|
1749
|
+
```
|
1750
|
+
|
1751
|
+
This generates the following HTML:
|
1752
|
+
|
1753
|
+
```html
|
1754
|
+
<div class="mb-3">
|
1755
|
+
<label class="form-label required" for="user_fruit_id">Favorite fruit</label>
|
1756
|
+
<div class="rails-bootstrap-forms-collection-radio-buttons">
|
1757
|
+
<div class="form-check form-check-inline">
|
1758
|
+
<input class="form-check-input" type="radio" value="1" name="user[fruit_id]" id="user_fruit_id_1">
|
1759
|
+
<label class="form-check-label" for="user_fruit_id_1">Mango</label>
|
1760
|
+
</div>
|
1761
|
+
<div class="form-check form-check-inline">
|
1762
|
+
<input class="form-check-input" type="radio" value="2" name="user[fruit_id]" id="user_fruit_id_2">
|
1763
|
+
<label class="form-check-label" for="user_fruit_id_2">Apple</label>
|
1764
|
+
</div>
|
1765
|
+
<div class="form-check form-check-inline">
|
1766
|
+
<input class="form-check-input" type="radio" value="3" name="user[fruit_id]" id="user_fruit_id_3">
|
1767
|
+
<label class="form-check-label" for="user_fruit_id_3">Orange</label>
|
1768
|
+
</div>
|
1769
|
+
<div class="form-check form-check-inline">
|
1770
|
+
<input class="form-check-input" type="radio" value="4" name="user[fruit_id]" id="user_fruit_id_4">
|
1771
|
+
<label class="form-check-label" for="user_fruit_id_4">Watermelon</label>
|
1772
|
+
</div>
|
1773
|
+
</div>
|
1774
|
+
<div class="form-text text-muted">Select your favorite fruit</div>
|
1775
|
+
</div>
|
1776
|
+
```
|
1777
|
+
|
1778
|
+
## Internationalization
|
1779
|
+
|
1780
|
+
`rails_bootstrap_form` follows standard rails conventions so it's i18n-ready. See more [here](http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models)
|
1781
|
+
|
1782
|
+
## Other Tips
|
1783
|
+
|
1784
|
+
### Empty But Visible Labels
|
1785
|
+
|
1786
|
+
Some third party plug-ins require an empty but visible label on an input control. The `hide_label` option generates a label that won't appear on the screen, but it's considered invisible and therefore doesn't work with such a plug-in. An empty label (e.g. `""`) causes the underlying Rails helpers to generate a label based on the field's attribute's name.
|
1787
|
+
|
1788
|
+
The solution is to use a zero-width character for the label, or some other "empty" HTML. For example:
|
1789
|
+
|
1790
|
+
```erb
|
1791
|
+
bootstrap_form: {label_text: "​".html_safe}
|
1792
|
+
```
|
1793
|
+
|
1794
|
+
or
|
1795
|
+
|
1796
|
+
```erb
|
1797
|
+
bootstrap_form: {label_text: "<span></span>".html_safe}
|
1798
|
+
```
|
1799
|
+
|
1800
|
+
## Contributing
|
1801
|
+
|
1802
|
+
I welcome contributions. If you wish to contribute in `rails_bootstrap_form`, please review the [Contributing]() document first.
|
1803
|
+
|
1804
|
+
## License
|
1805
|
+
|
1806
|
+
Copyright 2023 [Harshal V. LADHE](https://github.com/shivam091), Released under the MIT License
|