class PathUtilities::Form::UniquenessValidator::Mongoid

Public Class Methods

new(options) click to toggle source
Calls superclass method
# File lib/path_utilities/form/uniqueness_validator/mongoid.rb, line 7
def initialize(options)
  @klass = options[:model] if options[:model]
  super
end

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
Calls superclass method
# File lib/path_utilities/form/uniqueness_validator/mongoid.rb, line 12
def validate_each(record, attribute, value)
  # UniquenessValidator can't be used outside of Mongoid::Document instances, here
  # we return the exact same error, unless the 'model' option is given.
  #
  if !options[:model] && !record.class.ancestors.include?(Mongoid::Document)
    fail ArgumentError, "Unknown validator: 'UniquenessValidator'"

  # If we're inside an ActiveRecord class, and `model` isn't set, use the
  # default behaviour of the validator.
  #
  elsif !options[:model]
    super

  # Custom validator options. The validator can be called in any class, as
  # long as it includes `ActiveModel::Validations`. You can tell the validator
  # which Mongoid::Document based class to check against, using the `model`
  # option. Also, if you are using a different attribute name, you can set the
  # correct one for the ActiveRecord class using the `attribute` option.
  #
  else
    record_org, attribute_org = record, attribute

    attribute = options[:attribute].to_sym if options[:attribute]
    record = options[:model].new(attribute => value)
    is_new_record = record_org.instance_model_for(attribute).new_record?

    if is_new_record || record_org.changes?(attribute)
      super

      if record.errors.any?

        record_org.errors.add(attribute_org, :taken,
          options.except(:case_sensitive, :scope).merge(value: value))
      end
    end
  end
end