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 = {}) ⇒ 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) ⇒ Object
Nested fields.
-
#fields_for_collection(name, &block) ⇒ 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 = {}) ⇒ 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
1353 1354 1355 1356 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1353 def (content, attributes = {}) # This is here only for documentation purposes 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.
453 454 455 456 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 453 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
482 483 484 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 482 def color_field(name, attributes = {}) input _attributes(:color, name, attributes) end |
#datalist(name, values, list, attributes = {}) ⇒ Object
Datalist input
1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1313 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
510 511 512 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 510 def date_field(name, attributes = {}) input _attributes(:date, name, attributes) end |
#datetime_field(name, attributes = {}) ⇒ Object
Datetime input
538 539 540 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 538 def datetime_field(name, attributes = {}) input _attributes(:datetime, name, attributes) end |
#datetime_local_field(name, attributes = {}) ⇒ Object
Datetime Local input
566 567 568 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 566 def datetime_local_field(name, attributes = {}) input _attributes(:'datetime-local', name, attributes) end |
#email_field(name, attributes = {}) ⇒ Object
Email input
678 679 680 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 678 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.
203 204 205 206 207 208 209 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 203 def fields_for(name) current_name = @name @name = _input_name(name) yield(name) ensure @name = current_name end |
#fields_for_collection(name, &block) ⇒ Object
Nested collections
Supports nesting for collections, with infinite levels of nesting.
241 242 243 244 245 246 247 248 249 250 251 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 241 def fields_for_collection(name, &block) current_name = @name base_value = _value(name) @name = _input_name(name) base_value.count.times do |index| fields_for(index, &block) end ensure @name = current_name end |
#fieldset(content = nil, attributes = {}) ⇒ Object
Fieldset
350 351 352 353 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 350 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**
815 816 817 818 819 820 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 815 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
756 757 758 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 756 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
1386 1387 1388 1389 1390 1391 1392 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1386 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.
312 313 314 315 316 317 318 319 320 321 322 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 312 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
622 623 624 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 622 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.
847 848 849 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 847 def number_field(name, attributes = {}) input _attributes(:number, name, attributes) end |
#password_field(name, attributes = {}) ⇒ Object
Password input
1072 1073 1074 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1072 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.
1051 1052 1053 1054 1055 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1051 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.
878 879 880 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 878 def range_field(name, attributes = {}) input _attributes(:range, name, attributes) end |
#search_field(name, attributes = {}) ⇒ Object
Search input
997 998 999 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 997 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.
1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1227 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 button
1418 1419 1420 1421 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 1418 def submit(content, attributes = {}) attributes = { type: :submit }.merge(attributes) (content, attributes) end |
#tel_field(name, attributes = {}) ⇒ Object
Telephone input
737 738 739 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 737 def tel_field(name, attributes = {}) input _attributes(:tel, name, attributes) end |
#text_area(name, content = nil, attributes = {}) ⇒ Object
Text-area input
934 935 936 937 938 939 940 941 942 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 934 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
968 969 970 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 968 def text_field(name, attributes = {}) input _attributes(:text, name, attributes) end |
#time_field(name, attributes = {}) ⇒ Object
Time field
594 595 596 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 594 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
706 707 708 709 710 711 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 706 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
650 651 652 |
# File 'lib/hanami/helpers/form_helper/form_builder.rb', line 650 def week_field(name, attributes = {}) input _attributes(:week, name, attributes) end |