Class: Formtastic::Inputs::NumberInput

Inherits:
Object
  • Object
show all
Includes:
Base, Base::Stringish
Defined in:
lib/formtastic/inputs/number_input.rb

Overview

Outputs a simple <label> with a HTML5 <input type="number"> wrapped in the standard <li> wrapper. This is the default input choice for all database columns of the type :float and :decimal, as well as :integer columns that aren't used for belongs_to associations, but can be applied to any text-like input with :as => :number.

Sensible default values for the min, max and step attributes are found by reflecting on the model's validations (when provided). An IndeterminableMinimumAttributeError exception will be raised when the following conditions are all true:

  • you haven't specified a :min or :max for the input
  • the model's database column type is a :float or :decimal
  • the validation uses :less_than or :greater_than

The solution is to either:

  • manually specify the :min or :max for the input
  • change the database column type to an :integer (if appropriate)
  • change the validations to use :less_than_or_equal_to or :greater_than_or_equal_to

Examples:

Full form context and output


<%= semantic_form_for(@user) do |f| %>
  <%= f.inputs do %>
    <%= f.input :shoe_size, :as => :number %>
  <% end %>
<% end %>

<form...>
  <fieldset>
    <ol>
      <li class="numeric">
        <label for="user_shoe_size">Shoe size</label>
        <input type="number" id="user_shoe_size" name="user[shoe_size]">
      </li>
    </ol>
  </fieldset>
</form>

Default HTML5 min/max/step attributes are detected from the numericality validations


class Person < ActiveRecord::Base
  validates_numericality_of :age, 
    :less_than_or_equal_to => 100, 
    :greater_than_or_equal_to => 18, 
    :only_integer => true
end

<%= f.input :age, :as => :number %>

<li class="numeric">
  <label for="persom_age">Age</label>
  <input type="number" id="person_age" name="person[age]" min="18" max="100" step="1">
</li>

Pass attributes down to the <input> tag with :input_html

<%= f.input :shoe_size, :as => :number, :input_html => { :min => 3, :max => 15, :step => 1, :class => "special" } %>

Min/max/step also work as options

<%= f.input :shoe_size, :as => :number, :min => 3, :max => 15, :step => 1, :input_html => { :class => "special" } %>

Use :in with a Range as a shortcut for :min/:max

<%= f.input :shoe_size, :as => :number, :in => 3..15, :step => 1 %>
<%= f.input :shoe_size, :as => :number, :input_html => { :in => 3..15, :step => 1 } %>

See Also:

Direct Known Subclasses

NumericInput

Instance Attribute Summary

Attributes included from Base

#builder, #method, #object, #object_name, #options, #template

Instance Method Summary collapse

Methods included from Base::Stringish

#placeholder_text, #wrapper_html_options

Methods included from Base

#initialize, #warn_and_correct_option!

Methods included from Base::Wrapping

#input_wrapping, #wrapper_dom_id, #wrapper_html_options

Methods included from Base::Labelling

#label_from_options, #label_html, #label_html_options, #label_text, #localized_label, #render_label?, #requirement_text, #requirement_text_or_proc

Methods included from Base::Associations

#association, #association_primary_key, #belongs_to?, #has_many?, #reflection

Methods included from Base::Fileish

#file?

Methods included from Base::Validations

#autofocus?, #column_limit, #limit, #not_required_through_negated_validation!, #not_required_through_negated_validation?, #optional?, #required?, #required_attribute?, #responds_to_global_required?, #validation_integer_only?, #validation_limit, #validation_max, #validation_min, #validation_step, #validations, #validations?, #validator_relevant?

Methods included from Base::Naming

#as, #attributized_method_name, #humanized_method_name, #input_name, #sanitized_method_name, #sanitized_object_name

Methods included from Base::Hints

#hint?, #hint_html, #hint_text, #hint_text_from_options

Methods included from Base::Errors

#error_first_html, #error_html, #error_keys, #error_list_html, #error_none_html, #error_sentence_html, #errors, #errors?

Methods included from Base::Database

#column, #column?

Methods included from Base::Options

#formtastic_options, #input_options

Methods included from Base::Html

#dom_id, #dom_index

Instance Method Details

#in_optionObject



112
113
114
# File 'lib/formtastic/inputs/number_input.rb', line 112

def in_option
  options[:in]
end

#input_html_optionsObject



81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/formtastic/inputs/number_input.rb', line 81

def input_html_options
  defaults = super
  
  if in_option
    defaults[:min] = in_option.to_a.min
    defaults[:max] = in_option.to_a.max
  else
    defaults[:min]  ||= min_option
    defaults[:max]  ||= max_option
  end
  defaults[:step] ||= step_option
  defaults
end

#max_optionObject



107
108
109
110
# File 'lib/formtastic/inputs/number_input.rb', line 107

def max_option
  return options[:max] if options.key?(:max)
  validation_max
end

#min_optionObject



102
103
104
105
# File 'lib/formtastic/inputs/number_input.rb', line 102

def min_option
  return options[:min] if options.key?(:min)
  validation_min
end

#step_optionObject



95
96
97
98
99
100
# File 'lib/formtastic/inputs/number_input.rb', line 95

def step_option
  return options[:step] if options.key?(:step)
  return validation_step if validation_step
  return 1 if validation_integer_only?
  "any"
end

#to_htmlObject



74
75
76
77
78
79
# File 'lib/formtastic/inputs/number_input.rb', line 74

def to_html
  input_wrapping do
    label_html <<
    builder.number_field(method, input_html_options)
  end
end