Sha256: 767ca6273ca5dffcc216ab07b5dfe2e70e9fa4b2db7aa41e4a4bd51da3184b9d

Contents?: true

Size: 1.94 KB

Versions: 5

Compression:

Stored size: 1.94 KB

Contents

module FreeForm
  module Validation
    def self.included(base)
      base.extend(ClassMethods)
      extend FreeForm::Property
    end

    module ClassMethods
      def validate_nested_forms
        validate :validate_nested_forms
      end

      def validate_models
        validate :validate_component_models
      end
    end

  protected
    def validate_nested_forms
      models.each { |m| validate_nested_form(m) if m.is_a?(FreeForm::Form) }
    end

    def validate_component_models
      models.each { |m| validate_model(m) unless m.is_a?(FreeForm::Form) }
    end

  private
    def validate_nested_form(form)
      errors.add(:base, "has invalid nested forms") unless marked_for_destruction_or_valid?(form)
    end

    def validate_model(model)
      model.valid?
      add_model_errors_to_form(model)
    end

    def marked_for_destruction_or_valid?(form)
      form_marked_for_destruction?(form) || form.valid?
    end

    def form_marked_for_destruction?(form)
      form.respond_to?(:marked_for_destruction?) ? form.marked_for_destruction? : false
    end

    def add_model_errors_to_form(model)
      model.errors.each do |error, message|
        add_error_to_form(model, error, message)
      end
    end

    def add_error_to_form(model, error, message)
      field = find_form_field_from_model_field(model, error)
      if field
        errors.add(field, message)
      end
    end

    def find_form_field_from_model_field(model, error_field)
      model_property_mappings.each_pair do |property, attributes|
        model_sym = model_symbol_from_model(model)
        field_sym = error_field.to_sym

        if (attributes[:model] == model_sym) && (attributes[:field] == field_sym)
          return property
        end
      end
      nil
    end

    def model_symbol_from_model(model)
      models_as_symbols.find { |sym| return sym if send(sym) == model }
    end

    def models_as_symbols
      self.class.models.map { |x| x.to_sym }
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
freeform-2.0.4 lib/freeform/form/validation.rb
freeform-2.0.3 lib/freeform/form/validation.rb
freeform-2.0.2 lib/freeform/form/validation.rb
freeform-2.0.1 lib/freeform/form/validation.rb
freeform-2.0.0 lib/freeform/form/validation.rb