Sha256: c07d68726ffaa697c9a3ff10a3eca9297f8523844fb7d2b1ea0093e1d4694a76

Contents?: true

Size: 1.43 KB

Versions: 5

Compression:

Stored size: 1.43 KB

Contents

require 'active_model/validator'

module Ripple
  module Validations
    class AssociatedValidator < ActiveModel::EachValidator
      include Translation
      def validate_each(record, attribute, value)
        return if (value.is_a?(Array) ? value : [value]).collect{ |r| r.nil? || r.valid? }.all?
        record.errors.add(attribute, error_message_for(attribute, value))
      end

      private

        def error_message_for(attribute, associated_records)
          if associated_records.respond_to?(:each_with_index)
            record_errors = associated_records.enum_for(:each_with_index).collect do |record, index|
              next unless record.errors.any?

              t("associated_document_error_summary",
                :doc_type => attribute.to_s.singularize,
                :doc_id => index + 1,
                :errors => record.errors.full_messages.to_sentence
              )
            end
            record_errors.compact!
            record_errors.flatten!

            t("many_association_validation_error",
              :association_errors => record_errors.join('; '))
          else
            t("one_association_validation_error",
              :association_errors => associated_records.errors.full_messages.to_sentence)
          end
        end
    end

    module ClassMethods
      def validates_associated(*attr_names)
        validates_with AssociatedValidator, _merge_attributes(attr_names)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 4 rubygems

Version Path
wyngle-ripple-0.1.0 lib/ripple/validations/associated_validator.rb
better-ripple-1.0.0 lib/ripple/validations/associated_validator.rb
ripple-1.0.0.beta2 lib/ripple/validations/associated_validator.rb
seomoz-ripple-1.0.0.pre lib/ripple/validations/associated_validator.rb
ripple-1.0.0.beta lib/ripple/validations/associated_validator.rb