class Fluffery::Forms::Validation::Base
Attributes
object[RW]
Public Class Methods
new(form_object)
click to toggle source
# File lib/fluffery/forms/validation/base.rb, line 11 def initialize(form_object) @object = form_object end
Public Instance Methods
add_html_attributes(attribute, options)
click to toggle source
# File lib/fluffery/forms/validation/base.rb, line 15 def add_html_attributes(attribute, options) options = Presence.create(attribute, options) if attribute_required?(attribute) matcher = attribute_format_validator(attribute) options = Pattern.create(attribute, options, matcher) unless matcher.nil? options.reverse_merge!(default_messages_for(attribute)) options end
attribute_format_validator(attribute)
click to toggle source
Checks to see if a particular attribute contains a Regex format validator
# File lib/fluffery/forms/validation/base.rb, line 39 def attribute_format_validator(attribute) format_validator = validators_for(attribute).detect{ |v| v.kind == :format } return nil unless !format_validator.nil? return nil unless format_validator.options.has_key?(:with) && format_validator.options[:with].is_a?(Regexp) matcher = format_validator.options[:with] end
attribute_required?(attribute, options = nil)
click to toggle source
Checks to see if the particular attribute is required, used primarily on labels.
# File lib/fluffery/forms/validation/base.rb, line 25 def attribute_required?(attribute, options = nil) options.stringify_keys! if options.is_a?(Hash) unless options.nil? return true if options.has_key?('required') and options['required'] === true end valid_items = validators_for(attribute).find do |validator| ([:presence, :inclusion].include?(validator.kind)) && (validator.options.present? ? options_require_validation?(validator.options) : true) end !valid_items.nil? end
default_messages_for(attribute)
click to toggle source
Looks up the default error message so it may be used in our data-message attribute
# File lib/fluffery/forms/validation/base.rb, line 48 def default_messages_for(attribute) validators = validators_for(attribute) return {} if validators.empty? message_data = validators.inject({}) do |hash, validator| message = validator.options.has_key?(:message) ? validator.options[:message] : MessageBuilder.message_for(@object, attribute, validator) hash.merge!(validator.kind.to_s => message) end attr_hash = {'data-validation-messages' => CGI::escape(message_data.to_json) } # Create a list of data-validates-* attrs on the field so we can catch them with javascript # Skip presence and format because they have their own valid HTML5 attrs. # validators.reject{ |v| v.kind.to_s.match(/(presence|format)/i) }.each{ |v| attr_hash.merge!("data-validates-#{v.kind.to_s}" => 'true') } attr_hash end
errors_for?(method)
click to toggle source
Checks to see if the particular attribute has errors
# File lib/fluffery/forms/validation/base.rb, line 68 def errors_for?(method) !(@object.nil? || @object.errors.empty? || !@object.errors.key?(method.to_sym) || [@object.errors[method.to_sym]].flatten.empty?) end
options_require_validation?(options)
click to toggle source
Checks to see if the validation is required Courtesy Justin French and Formtastic
# File lib/fluffery/forms/validation/base.rb, line 75 def options_require_validation?(options) allow_blank = options[:allow_blank] return !allow_blank unless allow_blank.nil? if_condition = !options[:if].nil? condition = if_condition ? options[:if] : options[:unless] condition = if condition.respond_to?(:call) condition.call(@object) elsif condition.is_a?(::Symbol) && @object.respond_to?(condition) @object.send(condition) else condition end if_condition ? !!condition : !condition end
validators_for(attribute)
click to toggle source
Finds all existing validations for the current object and method
# File lib/fluffery/forms/validation/base.rb, line 94 def validators_for(attribute) return [] unless !@object.nil? and @object.class.respond_to?(:validators_on) attribute = attribute.to_s.sub(/_id$/, '').to_sym validators = @object.class.validators_on(attribute).uniq end
validators_for?(method)
click to toggle source
# File lib/fluffery/forms/validation/base.rb, line 100 def validators_for?(method) !validators_for(method).empty? end