module CollectionErrors::Separate::ClassMethods

Public Instance Methods

separate_errors_on(*args) click to toggle source
# File lib/collection_errors/separate.rb, line 26
def separate_errors_on(*args)
  options = {:ignore_marked_for_destruction => false}.merge(args.extract_options!)

  args.each do |collection_name|
    method_name = "separate_errors_on_#{collection_name}"

    define_method method_name do

      # Remove 'collection_name.xxx' attributes from errors
      targets = []
      errors.each do |attribute, message|
        targets << attribute if attribute.to_s =~ /^#{collection_name}\./
      end
      targets.each{|k| errors.delete(k) }

      # Add original errors
      index = 0
      send(collection_name).each do |r|
        next if options[:ignore_marked_for_destruction] && r.marked_for_destruction?
        index += 1
        next if r.errors.empty?

        r.errors.full_messages.each do |full_message|
          errors.add(:base, generate_error_message_for_collection_element(collection_name, index, full_message))
        end
      end
    end

    after_validation method_name
  end
end