Class: Hanami::Helpers::FormHelper::FormBuilder
- Inherits:
-
HtmlHelper::HtmlBuilder
- Object
- HtmlHelper::HtmlBuilder
- Hanami::Helpers::FormHelper::FormBuilder
- Includes:
- EscapeHelper
- 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
-
#button(content, attributes = {}, &blk) ⇒ Object
Button.
-
#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, value = nil) {|index| ... } ⇒ Object
Nested fields.
-
#fields_for_collection(name) {|index, value| ... } ⇒ Object
Nested collections.
-
#fieldset(content = nil, attributes = {}) ⇒ Object
Fieldset.
-
#file_field(name, attributes = {}) ⇒ Object
File input.
-
#hidden_field(name, attributes = {}) ⇒ Object
Hidden input.
-
#image_button(source, attributes = {}) ⇒ Object
Image button.
-
#initialize(form, attributes, context = nil, &blk) ⇒ Hanami::Helpers::FormHelper::FormBuilder
constructor
private
Instantiate a form builder.
-
#label(content, attributes = {}) ⇒ Object
Label tag.
-
#month_field(name, attributes = {}) ⇒ Object
Month field.
-
#number_field(name, attributes = {}) ⇒ Object
Number input.
-
#password_field(name, attributes = {}) ⇒ Object
Password input.
-
#radio_button(name, value, attributes = {}) ⇒ Object
Radio input.
-
#range_field(name, attributes = {}) ⇒ Object
Range input.
-
#search_field(name, attributes = {}) ⇒ Object
Search input.
-
#select(name, values, attributes = {}) ⇒ Object
Select input.
-
#submit(content, attributes = {}, &blk) ⇒ Object
Submit button.
-
#tel_field(name, attributes = {}) ⇒ Object
Telephone input.
-
#text_area(name, content = nil, attributes = {}) ⇒ Object
Text-area input.
-
#text_field(name, attributes = {}) ⇒ Object
(also: #input_text)
Text input.
-
#time_field(name, attributes = {}) ⇒ Object
Time field.
-
#to_s ⇒ Hanami::Utils::Escape::SafeString
private
Resolves all the nodes and generates the markup.
-
#url_field(name, attributes = {}) ⇒ Object
URL input.
-
#week_field(name, attributes = {}) ⇒ Object
Week field.
Methods inherited from HtmlHelper::HtmlBuilder
#empty_tag, #encode, #fragment, #method_missing, #nested?, #resolve, #tag, #text
Constructor Details
#initialize(form, attributes, context, &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
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 102 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
#button(content, attributes = {}) ⇒ Object #button(attributes = {}, &blk) ⇒ Object
Button
1427 1428 1429 1430 1431 1432 1433 1434 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1427 def (content, attributes = {}, &blk) if content.is_a?(::Hash) attributes = content content = nil end super end |
#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.
507 508 509 510 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 507 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
536 537 538 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 536 def color_field(name, attributes = {}) input _attributes(:color, name, attributes) end |
#datalist(name, values, list, attributes = {}) ⇒ Object
Datalist input
1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1367 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
564 565 566 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 564 def date_field(name, attributes = {}) input _attributes(:date, name, attributes) end |
#datetime_field(name, attributes = {}) ⇒ Object
Datetime input
592 593 594 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 592 def datetime_field(name, attributes = {}) input _attributes(:datetime, name, attributes) end |
#datetime_local_field(name, attributes = {}) ⇒ Object
Datetime Local input
620 621 622 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 620 def datetime_local_field(name, attributes = {}) input _attributes(:'datetime-local', name, attributes) end |
#email_field(name, attributes = {}) ⇒ Object
Email input
732 733 734 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 732 def email_field(name, attributes = {}) input _attributes(:email, name, attributes) end |
#fields_for(name, value = nil) {|index| ... } ⇒ Object
Nested fields
The inputs generated by the wrapped block will be prefixed with the given name It supports infinite levels of nesting.
206 207 208 209 210 211 212 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 206 def fields_for(name, value = nil) current_name = @name @name = _input_name(name) yield(name, value) ensure @name = current_name end |
#fields_for_collection(name) {|index, value| ... } ⇒ Object
Nested collections
Supports nesting for collections, with infinite levels of nesting.
295 296 297 298 299 300 301 302 303 304 305 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 295 def fields_for_collection(name, &block) current_name = @name base_value = _value(name) @name = _input_name(name) base_value.each_with_index do |value, index| fields_for(index, value, &block) end ensure @name = current_name end |
#fieldset(content = nil, attributes = {}) ⇒ Object
Fieldset
404 405 406 407 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 404 def fieldset(content = nil, attributes = {}) # This is here only for documentation purposes super end |
#file_field(name, attributes = {}) ⇒ Object
File input
**PLEASE REMEMBER TO ADD enctype: 'multipart/form-data'
ATTRIBUTE TO THE FORM**
869 870 871 872 873 874 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 869 def file_field(name, attributes = {}) attributes[:accept] = Array(attributes[:accept]).join(ACCEPT_SEPARATOR) if attributes.key?(:accept) attributes = { type: :file, name: _displayed_input_name(name), id: _input_id(name) }.merge(attributes) input(attributes) end |
#hidden_field(name, attributes = {}) ⇒ Object
Hidden input
810 811 812 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 810 def hidden_field(name, attributes = {}) input _attributes(:hidden, name, attributes) end |
#image_button(source, attributes = {}) ⇒ Object
Image button
Visual submit button
**Please note:** for security reasons, please use the absolute URL of the image
1464 1465 1466 1467 1468 1469 1470 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1464 def (source, attributes = {}) attrs = attributes.dup attrs[:type] = :image attrs[:src] = escape_url(source) input attrs 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.
366 367 368 369 370 371 372 373 374 375 376 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 366 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.capitalize(content) end super(content, attributes) end |
#month_field(name, attributes = {}) ⇒ Object
Month field
676 677 678 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 676 def month_field(name, attributes = {}) input _attributes(:month, name, 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.
901 902 903 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 901 def number_field(name, attributes = {}) input _attributes(:number, name, attributes) end |
#password_field(name, attributes = {}) ⇒ Object
Password input
1126 1127 1128 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1126 def password_field(name, attributes = {}) input({ type: :password, name: _displayed_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.
1105 1106 1107 1108 1109 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1105 def (name, value, attributes = {}) attributes = { type: :radio, name: _displayed_input_name(name), value: value }.merge(attributes) attributes[:checked] = CHECKED if _value(name).to_s == value.to_s input(attributes) end |
#range_field(name, attributes = {}) ⇒ Object
Range input
You can also make use of the ‘max`, `min`, and `step` attributes for the HTML5 number field.
932 933 934 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 932 def range_field(name, attributes = {}) input _attributes(:range, name, attributes) end |
#search_field(name, attributes = {}) ⇒ Object
Search input
1051 1052 1053 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1051 def search_field(name, attributes = {}) input _attributes(:search, name, attributes) end |
#select(name, values, attributes = {}) ⇒ Object
Select input
Values is used to generate the list of <option>
tags, it is an Enumerable
of pairs of content (the displayed text) and value (the tag’s attribute), in that respective order (please refer to the examples for more clarity).
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.
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1281 def select(name, values, attributes = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength = attributes.delete(:options) { {} } multiple = attributes[:multiple] attributes = { name: _select_input_name(name, multiple), id: _input_id(name) }.merge(attributes) prompt = .delete(:prompt) selected = .delete(:selected) input_value = _value(name) super(attributes) do option(prompt) unless prompt.nil? already_selected = nil values.each do |content, value| if (multiple || !already_selected) && (already_selected = _select_option_selected?(value, selected, input_value, multiple)) option(content, { value: value, selected: SELECTED }.merge()) else option(content, { value: value }.merge()) end end end end |
#submit(content, attributes = {}) ⇒ Object #submit(attributes = {}, &blk) ⇒ Object
Submit button
1516 1517 1518 1519 1520 1521 1522 1523 1524 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1516 def submit(content, attributes = {}, &blk) if content.is_a?(::Hash) attributes = content content = nil end attributes = { type: :submit }.merge(attributes) (content, attributes, &blk) end |
#tel_field(name, attributes = {}) ⇒ Object
Telephone input
791 792 793 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 791 def tel_field(name, attributes = {}) input _attributes(:tel, name, attributes) end |
#text_area(name, content = nil, attributes = {}) ⇒ Object
Text-area input
988 989 990 991 992 993 994 995 996 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 988 def text_area(name, content = nil, attributes = {}) if content.respond_to?(:to_hash) attributes = content content = nil end attributes = { name: _displayed_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
1022 1023 1024 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1022 def text_field(name, attributes = {}) input _attributes(:text, name, attributes) end |
#time_field(name, attributes = {}) ⇒ Object
Time field
648 649 650 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 648 def time_field(name, attributes = {}) input _attributes(:time, 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
134 135 136 137 138 139 140 141 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 134 def to_s if toplevel? _method_override! form(@blk, @attributes) end super end |
#url_field(name, attributes = {}) ⇒ Object
URL input
760 761 762 763 764 765 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 760 def url_field(name, attributes = {}) attrs = attributes.dup attrs[:value] = escape_url(attrs.fetch(:value) { _value(name) }) input _attributes(:url, name, attrs) end |
#week_field(name, attributes = {}) ⇒ Object
Week field
704 705 706 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 704 def week_field(name, attributes = {}) input _attributes(:week, name, attributes) end |