Sha256: b1bf4dd30a98c3442c0b24c1da0560a6877e473c496eb68727d0df7940c7c6db

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

require 'active_support/concern'
require 'act_form/utils'

module ActForm
  module Combinable
    extend ActiveSupport::Concern

    included do
      class_attribute :_forms, instance_writer: false
      self._forms = []
    end

    class_methods do

      def combine(*forms)
        forms.each do |form_class|
          raise ArgumentError, 'Can not combine itself' if form_class == self

          next if self._forms.include?(form_class)

          self._forms << form_class

          self.attribute_set.merge(form_class.attribute_set)

          Utils.merge(self._validators, form_class._validators)

          method_name = form_class.model_name.singular
          define_method(method_name) { form_class.new(attributes) }
          form_class._validate_callbacks.each do |callback|
            filter = callback.filter
            if filter.is_a?(Symbol) || filter.is_a?(String)
              class_eval <<-RUBY, __FILE__, __LINE__ + 1
                def #{filter}
                  form = #{method_name}
                  form.send(:#{filter})
                  form.errors.messages.each do |attr, _errors|
                    _errors.each { |err| errors.add(attr, err) }
                  end
                end
                private :#{filter}
              RUBY
            end
          end
          self._validate_callbacks.append *form_class._validate_callbacks
        end # forms.each
      end # combine

    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
act_form-0.1.0 lib/act_form/combinable.rb