HTML input attributes helper
Installation
gem "input_attributes_from_validators"
The main idea
HTML inputs have powerful controls over browser via attributes:
Normally you write those HTML attributes manually or forget about them, but most of them can be inferred from model validations and the DB column name.
How to use
Provided that you have validators on your model:
class Review < ActiveRecord::Base
validates :comment, presence: true, length: { min: 3, max: 1_000 }
validates :score, numericality: { only_integer: true, in: 1..5 }
end
Individual helper methods
This gem exposes a set of helper methods, one for the corresponding HTML attribute:
validated_inputmode @rating, :comment #=> "text"
validated_minlength @review, :comment #=> 3
validated_maxlength @review, :comment #=> 1_000
validated_required @review, :comment #=> true
validated_inputmode @rating, :score #=> "numeric"
validated_min @rating, :score #=> 1
validated_max @rating, :score #=> 5
validated_step @rating, :score #=> 1
Aggregate method
There is also a method that returns a hash with all the values:
resolved_input_attributes(record, attribute_name) #=>
{
inputmode: <String || NilClass>,,
max: <Integer || NilClass>,
maxlength: <Integer || NilClass>,
min: <Integer || NilClass>,
minlength: <Integer || NilClass>,
required: <Boolean>,
step: <Integer || Decimal>,
}
so you don’t have to repeadedly pass the record and the attribute name:
= form_for model: @review do |f|
- attrs = resolved_input_attributes(@review, :score)
= f.number_field :size \
inputmode: attrs[:inputmode], \
max: attrs[:max], \
min: attrs[:min], \
required: attrs[:required], \
step: attrs[:step]
= f.text_field :description \
inputmode: attrs[:inputmode], \
maxlength: attrs[:maxlength], \
minlength: attrs[:minlength], \
required: attrs[:required]
Less useful methods
Search for validators with certain conditions:
validators_for(record: @review, attr: :comment, type: :length, options: [:maximm])
#=> 255
validators_for(record: @review, attr: :score, type: :numericality, options: [:less_than, :less_than_or_equal_to])
#=> 5
Also
validated_value(record: @review, attr: :comment, type: :length, options: [:maximm])
#=> 255
validator_type_to_class :presence #=> ActiveRecord::Validations::PresenceValidator
validator_type_to_class :numericality #=> ActiveRecord::Validations::NumericalityValidator
Todo
- pattern attribute