module NxtSupport::AssignableValues

Public Instance Methods

assignable_values_for(column, values = [], **options, &block) click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 8
def assignable_values_for(column, values = [], **options, &block)
  @assignable_values ||= {}
  @assignable_values[column.to_sym] = {
    values: (block_given? ? block.call : values),
    default: options[:default],
    allow_blank: options[:allow_blank]
  }

  define_assignable_instance_methods
end
assignable_values_list_for(column) click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 19
def assignable_values_list_for(column)
  assignable_values[column][:values]
end
define_assignable_instance_methods() click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 23
def define_assignable_instance_methods
  assignable_values.keys.each do |key|
    define_method :"valid_#{key.to_s.pluralize}" do
      self.class.assignable_values_list_for(key)
    end
  end
end

Private Instance Methods

allow_blank_for?(attr) click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 64
def allow_blank_for?(attr)
  self.class.assignable_values[attr][:allow_blank]
end
attributes_to_validate() click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 72
def attributes_to_validate
  new_record? ? self.class.assignable_values.keys : (changed_keys & self.class.assignable_values.keys)
end
changed_keys() click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 76
def changed_keys
  changes.keys.map(&:to_sym)
end
changes_to_validate() click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 80
def changes_to_validate
  new_record? ? attributes.symbolize_keys : changes.transform_values(&:last).symbolize_keys
end
set_default_assignable() click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 52
def set_default_assignable
  self.class.assignable_values.each do |column, assignable|
    next unless new_record? && send(column).nil? && assignable[:default]

    if assignable[:default].is_a? Proc
      send("#{column}=", instance_exec(&assignable[:default]))
    else
      send("#{column}=", assignable[:default])
    end
  end
end
values_are_assignable() click to toggle source
# File lib/nxt_support/models/assignable_values.rb, line 39
def values_are_assignable
  attributes_to_validate.each do |attr|
    next if changes_to_validate[attr].blank? && allow_blank_for?(attr)
    next if changes_to_validate[attr].in?(assignable_values_for(attr))

    if changes_to_validate[attr].blank?
      errors.add(attr, "can't be blank.")
    else
      errors.add(attr, "the value #{changes_to_validate[attr]} is not in the list of acceptable values.")
    end
  end
end