module Enumerize::Base

Public Class Methods

included(base) click to toggle source
# File lib/enumerize/base.rb, line 3
def self.included(base)
  base.extend ClassMethods

  if base.respond_to?(:validate)
    base.validate :_validate_enumerized_attributes
  end

  class << base
    if (method_defined?(:inherited) || private_method_defined?(:inherited)) && !private_method_defined?(:inherited_without_enumerized)
      alias_method :inherited_without_enumerized, :inherited
      private :inherited_without_enumerized
    end

    alias_method :inherited, :inherited_with_enumerized
  end
end
new(*) click to toggle source
Calls superclass method
# File lib/enumerize/base.rb, line 58
def initialize(*)
  super
  _set_default_value_for_enumerized_attributes
end

Public Instance Methods

read_attribute_for_validation(key) click to toggle source
Calls superclass method
# File lib/enumerize/base.rb, line 63
def read_attribute_for_validation(key)
  key = key.to_s

  if _enumerized_values_for_validation.has_key?(key)
    _enumerized_values_for_validation[key]
  else
    super
  end
end

Private Instance Methods

_enumerized_values_for_validation() click to toggle source
# File lib/enumerize/base.rb, line 75
def _enumerized_values_for_validation
  @_enumerized_values_for_validation ||= {}
end
_set_default_value_for_enumerized_attributes() click to toggle source
# File lib/enumerize/base.rb, line 92
def _set_default_value_for_enumerized_attributes
  self.class.enumerized_attributes.each do |attr|
    # remove after dropping support for Rails 3.x
    # https://github.com/brainspec/enumerize/issues/101
    begin
      attr_value = public_send(attr.name)
    rescue ActiveModel::MissingAttributeError
      next
    end

    value_for_validation = _enumerized_values_for_validation[attr.name.to_s]

    if (!attr_value || attr_value.empty?) && (!value_for_validation || value_for_validation.empty?)
      value = attr.default_value

      if value.respond_to?(:call)
        value = value.arity == 0 ? value.call : value.call(self)
      end

      public_send("#{attr.name}=", value)
    end
  end
end
_validate_enumerized_attributes() click to toggle source
# File lib/enumerize/base.rb, line 79
def _validate_enumerized_attributes
  self.class.enumerized_attributes.each do |attr|
    value = read_attribute_for_validation(attr.name)
    next if value.blank?

    if attr.kind_of? Multiple
      errors.add attr.name unless value.respond_to?(:all?) && value.all? { |v| v.blank? || attr.find_value(v) }
    else
      errors.add attr.name, :inclusion unless attr.find_value(value)
    end
  end
end