Class: Lotus::Helpers::FormHelper::FormBuilder
- Inherits:
-
HtmlHelper::HtmlBuilder
- Object
- HtmlHelper::HtmlBuilder
- Lotus::Helpers::FormHelper::FormBuilder
- Defined in:
- lib/lotus/helpers/form_helper/form_builder.rb
Overview
Form builder
Constant Summary collapse
- BROWSER_METHODS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Set of HTTP methods that are understood by web browsers
['GET', 'POST'].freeze
- EXCLUDED_CSRF_METHODS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Set of HTTP methods that should NOT generate CSRF token
['GET'].freeze
- CHECKED =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Checked attribute value
'checked'.freeze
- SELECTED =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Selected attribute value for option
'selected'.freeze
- ACCEPT_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for accept attribute of file input
','.freeze
- INPUT_ID_REPLACEMENT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Replacement for input id interpolation
'-\k<token>'.freeze
- INPUT_VALUE_REPLACEMENT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Replacement for input value interpolation
'.\k<token>'.freeze
- DEFAULT_UNCHECKED_VALUE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Default value for unchecked check box
'0'.freeze
- DEFAULT_CHECKED_VALUE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Default value for checked check box
'1'.freeze
Constants inherited from HtmlHelper::HtmlBuilder
HtmlHelper::HtmlBuilder::CONTENT_TAGS, HtmlHelper::HtmlBuilder::EMPTY_TAGS, HtmlHelper::HtmlBuilder::NEWLINE
Instance Method Summary collapse
-
#check_box(name, attributes = {}) ⇒ Object
Check box.
-
#color_field(name, attributes = {}) ⇒ Object
Color input.
-
#date_field(name, attributes = {}) ⇒ Object
Date input.
-
#datetime_field(name, attributes = {}) ⇒ Object
Datetime input.
-
#datetime_local_field(name, attributes = {}) ⇒ Object
Datetime Local input.
-
#email_field(name, attributes = {}) ⇒ Object
Email input.
-
#fields_for(name) ⇒ Object
Nested fields.
-
#file_field(name, attributes = {}) ⇒ Object
File input.
-
#hidden_field(name, attributes = {}) ⇒ Object
Hidden input.
-
#initialize(form, attributes, context = nil, &blk) ⇒ Lotus::Helpers::FormHelper::FormBuilder
constructor
private
Instantiate a form builder.
-
#label(content, attributes = {}) ⇒ Object
Label tag.
-
#number_field(name, attributes = {}) ⇒ Object
Number input.
-
#password_field(name, attributes = {}) ⇒ Object
Password input.
-
#radio_button(name, value, attributes = {}) ⇒ Object
Radio input.
-
#select(name, values, attributes = {}) ⇒ Object
Select input.
-
#submit(content, attributes = {}) ⇒ Object
Submit button.
-
#text_area(name, content = nil, attributes = {}) ⇒ Object
Text-area input.
-
#text_field(name, attributes = {}) ⇒ Object
(also: #input_text)
Text input.
-
#to_s ⇒ Lotus::Utils::Escape::SafeString
private
Resolves all the nodes and generates the markup.
Methods inherited from HtmlHelper::HtmlBuilder
#empty_tag, #encode, #fragment, #method_missing, #nested?, #resolve, #tag, #text
Constructor Details
#initialize(form, attributes, params, &blk) ⇒ Lotus::Helpers::FormHelper::FormBuilder #initialize(form, attributes, params, &blk) ⇒ Lotus::Helpers::FormHelper::FormBuilder
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Instantiate a form builder
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 107 def initialize(form, attributes, context = nil, &blk) super() @context = context @blk = blk # Nested form if @context.nil? && attributes.is_a?(Values) @values = attributes @attributes = {} @name = form else @form = form @name = form.name @values = Values.new(form.values, @context.params) @attributes = attributes @verb_method = verb_method @csrf_token = csrf_token end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Lotus::Helpers::HtmlHelper::HtmlBuilder
Instance Method Details
#check_box(name, attributes = {}) ⇒ Object
Check box
It renders a check box input.
When a form is submitted, browsers don’t send the value of unchecked check boxes. If an user unchecks a check box, their browser won’t send the unchecked value. On the server side the corresponding value is missing, so the application will assume that the user action never happened.
To solve this problem the form renders a hidden field with the “unchecked value”. When the user unchecks the input, the browser will ignore it, but it will still send the value of the hidden input. See the examples below.
When editing a resource, the form automatically assigns the checked="checked"
attribute.
363 364 365 366 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 363 def check_box(name, attributes = {}) _hidden_field_for_check_box( name, attributes) input _attributes_for_check_box(name, attributes) end |
#color_field(name, attributes = {}) ⇒ Object
Color input
383 384 385 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 383 def color_field(name, attributes = {}) input _attributes(:color, name, attributes) end |
#date_field(name, attributes = {}) ⇒ Object
Date input
402 403 404 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 402 def date_field(name, attributes = {}) input _attributes(:date, name, attributes) end |
#datetime_field(name, attributes = {}) ⇒ Object
Datetime input
421 422 423 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 421 def datetime_field(name, attributes = {}) input _attributes(:datetime, name, attributes) end |
#datetime_local_field(name, attributes = {}) ⇒ Object
Datetime Local input
440 441 442 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 440 def datetime_local_field(name, attributes = {}) input _attributes(:'datetime-local', name, attributes) end |
#email_field(name, attributes = {}) ⇒ Object
Email input
459 460 461 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 459 def email_field(name, attributes = {}) input _attributes(:email, name, attributes) end |
#fields_for(name) ⇒ Object
Nested fields
The inputs generated by the wrapped block will be prefixed with the given name It supports infinite levels of nesting.
204 205 206 207 208 209 210 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 204 def fields_for(name) current_name = @name @name = _input_name(name) yield ensure @name = current_name end |
#file_field(name, attributes = {}) ⇒ Object
File input
PLEASE REMEMBER TO ADD enctype: 'multipart/form-data'
ATTRIBUTE TO THE FORM
518 519 520 521 522 523 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 518 def file_field(name, attributes = {}) attributes[:accept] = Array(attributes[:accept]).join(ACCEPT_SEPARATOR) if attributes.key?(:accept) attributes = { type: :file, name: _input_name(name), id: _input_id(name) }.merge(attributes) input(attributes) end |
#hidden_field(name, attributes = {}) ⇒ Object
Hidden input
478 479 480 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 478 def hidden_field(name, attributes = {}) input _attributes(:hidden, name, attributes) end |
#label(content, attributes = {}) ⇒ Object
Label tag
The first param content
can be a Symbol
that represents the target field (Eg. :extended_title
), or a String
which is used as it is.
# Output:
# <label for="book-extended-title">Extended title</label>
# Output:
# <label for="book-extended-title">Title</label>
# Output:
# <label for="ext-title">Extended title</label>
# Output:
# <label for="delivery-address-city">City</label>
# <input type="text" name="delivery[address][city] id="delivery-address-city" value="">
262 263 264 265 266 267 268 269 270 271 272 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 262 def label(content, attributes = {}) attributes = { for: _for(content, attributes.delete(:for)) }.merge(attributes) content = case content when String, Lotus::Utils::String content else Utils::String.new(content).capitalize end super(content, attributes) end |
#number_field(name, attributes = {}) ⇒ Object
Number input
You can also make use of the ‘max’, ‘min’, and ‘step’ attributes for the HTML5 number field.
550 551 552 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 550 def number_field(name, attributes = {}) input _attributes(:number, name, attributes) end |
#password_field(name, attributes = {}) ⇒ Object
Password input
696 697 698 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 696 def password_field(name, attributes = {}) input({ type: :password, name: _input_name(name), id: _input_id(name), value: nil }.merge(attributes)) end |
#radio_button(name, value, attributes = {}) ⇒ Object
Radio input
If request params have a value that corresponds to the given value, it automatically sets the checked
attribute. This Lotus::Controller integration happens without any developer intervention.
675 676 677 678 679 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 675 def (name, value, attributes = {}) attributes = { type: :radio, name: _input_name(name), value: value }.merge(attributes) attributes[:checked] = CHECKED if _value(name) == value input(attributes) end |
#select(name, values, attributes = {}) ⇒ Object
Select input
If request params have a value that corresponds to one of the given values, it automatically sets the selected
attribute on the <option>
tag. This Lotus::Controller integration happens without any developer intervention.
744 745 746 747 748 749 750 751 752 753 754 755 756 757 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 744 def select(name, values, attributes = {}) = attributes.delete(:options) || {} attributes = { name: _input_name(name), id: _input_id(name) }.merge(attributes) super(attributes) do values.each do |value, content| if _value(name) == value option(content, {value: value, selected: SELECTED}.merge()) else option(content, {value: value}.merge()) end end end end |
#submit(content, attributes = {}) ⇒ Object
Submit button
774 775 776 777 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 774 def submit(content, attributes = {}) attributes = { type: :submit }.merge(attributes) (content, attributes) end |
#text_area(name, content = nil, attributes = {}) ⇒ Object
Text-area input
606 607 608 609 610 611 612 613 614 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 606 def text_area(name, content = nil, attributes = {}) if content.respond_to?(:to_hash) attributes = content content = nil end attributes = {name: _input_name(name), id: _input_id(name)}.merge(attributes) textarea(content || _value(name), attributes) end |
#text_field(name, attributes = {}) ⇒ Object Also known as: input_text
Text input
631 632 633 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 631 def text_field(name, attributes = {}) input _attributes(:text, name, attributes) end |
#to_s ⇒ Lotus::Utils::Escape::SafeString
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Resolves all the nodes and generates the markup
137 138 139 140 141 142 143 144 |
# File 'lib/lotus/helpers/form_helper/form_builder.rb', line 137 def to_s if toplevel? _method_override! form(@blk, @attributes) end super end |