Class: Hanami::Helpers::FormHelper::FormBuilder
- Inherits:
-
HtmlHelper::HtmlBuilder
- Object
- HtmlHelper::HtmlBuilder
- Hanami::Helpers::FormHelper::FormBuilder
- Defined in:
- lib/hanami/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
%w(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
%w(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
- 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.
-
#datalist(name, values, list, attributes = {}) ⇒ Object
Datalist 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) ⇒ Hanami::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 ⇒ Hanami::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) ⇒ Hanami::Helpers::FormHelper::FormBuilder #initialize(form, attributes, params, &blk) ⇒ Hanami::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
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 99 def initialize(form, attributes, context = nil, &blk) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength super() @context = context @blk = blk @verb = nil @csrf_token = nil # 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 Hanami::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.
357 358 359 360 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 357 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
377 378 379 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 377 def color_field(name, attributes = {}) input _attributes(:color, name, attributes) end |
#datalist(name, values, list, attributes = {}) ⇒ Object
Datalist input
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 871 def datalist(name, values, list, attributes = {}) # rubocop:disable Metrics/MethodLength attrs = attributes.dup = attrs.delete(:options) || {} datalist = attrs.delete(:datalist) || {} attrs[:list] = list datalist[:id] = list text_field(name, attrs) super(datalist) do values.each do |value, content| option(content, { value: value }.merge()) end end end |
#date_field(name, attributes = {}) ⇒ Object
Date input
396 397 398 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 396 def date_field(name, attributes = {}) input _attributes(:date, name, attributes) end |
#datetime_field(name, attributes = {}) ⇒ Object
Datetime input
415 416 417 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 415 def datetime_field(name, attributes = {}) input _attributes(:datetime, name, attributes) end |
#datetime_local_field(name, attributes = {}) ⇒ Object
Datetime Local input
434 435 436 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 434 def datetime_local_field(name, attributes = {}) input _attributes(:'datetime-local', name, attributes) end |
#email_field(name, attributes = {}) ⇒ Object
Email input
453 454 455 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 453 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.
198 199 200 201 202 203 204 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 198 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
522 523 524 525 526 527 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 522 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
472 473 474 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 472 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="">
256 257 258 259 260 261 262 263 264 265 266 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 256 def label(content, attributes = {}) attributes = { for: _for(content, attributes.delete(:for)) }.merge(attributes) content = case content when String, Hanami::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.
554 555 556 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 554 def number_field(name, attributes = {}) input _attributes(:number, name, attributes) end |
#password_field(name, attributes = {}) ⇒ Object
Password input
700 701 702 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 700 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 Hanami::Controller integration happens without any developer intervention.
679 680 681 682 683 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 679 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 Hanami::Controller integration happens without any developer intervention.
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 788 def select(name, values, attributes = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength = attributes.delete(:options) { {} } attributes = { name: _select_input_name(name, attributes[:multiple]), id: _input_id(name) }.merge(attributes) prompt = .delete(:prompt) selected = .delete(:selected) super(attributes) do option(prompt) unless prompt.nil? values.each do |content, value| if _select_option_selected?(value, selected, _value(name), attributes[:multiple]) option(content, { value: value, selected: SELECTED }.merge()) else option(content, { value: value }.merge()) end end end end |
#submit(content, attributes = {}) ⇒ Object
Submit button
902 903 904 905 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 902 def submit(content, attributes = {}) attributes = { type: :submit }.merge(attributes) (content, attributes) end |
#text_area(name, content = nil, attributes = {}) ⇒ Object
Text-area input
610 611 612 613 614 615 616 617 618 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 610 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
635 636 637 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 635 def text_field(name, attributes = {}) input _attributes(:text, name, attributes) end |
#to_s ⇒ Hanami::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
131 132 133 134 135 136 137 138 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 131 def to_s if toplevel? _method_override! form(@blk, @attributes) end super end |