Sha256: fe45732d74abe25616b9cf5cf4df3f6ba44c5637abe0b211e76154b76abc833c

Contents?: true

Size: 1.11 KB

Versions: 2

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literal: true

require 'active_support/concern'

module ActForm
  module Combinable # rubocop:disable Style/Documentation
    extend ActiveSupport::Concern

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

    def valid?(context = nil)
      super
      combined_forms_valid?(context)
      errors.empty?
    end

    def combined_forms_valid?(context)
      return if _forms.empty?

      _forms.each do |form_class|
        form = form_class.new(attributes)
        form.valid?(context)
        form.errors.details.each do |attr_name, arr|
          arr.each do |error|
            next if error[:error] == :required

            errors.add(attr_name, error[:error])
          end
        end
      end
    end

    class_methods do
      def combine(*forms)
        forms.each do |form_class|
          raise ArgumentError, "can't combine itself" if form_class == self

          next if self._forms.include?(form_class)

          self.merge_attribute_set_from(form_class)
          self._forms << form_class
        end
      end # End of combine
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
act_form-0.4.4 lib/act_form/combinable.rb
act_form-0.4.3 lib/act_form/combinable.rb