class Para::AttributeFieldMappings

Constants

UNEDITABLE_ATTRIBUTES

Attributes

fields_hash[R]
mappings[R]
model[R]
whitelist_attributes[R]

Public Class Methods

new(model, whitelist_attributes: nil, mappings: nil) click to toggle source

The mappings hash is a form provided hash of attributes and input types mapping that are automatically generated in the form builder and that allows our model field parsers to spot unregistered fields and process them when needed.

# File lib/para/attribute_field_mappings.rb, line 12
def initialize(model, whitelist_attributes: nil, mappings: nil)
  @model = model
  @whitelist_attributes = whitelist_attributes
  @mappings = mappings || {}

  process_fields!
end

Public Instance Methods

field_for(field_name, type = nil) click to toggle source
# File lib/para/attribute_field_mappings.rb, line 24
def field_for(field_name, type = nil)
  existing_field = fields_hash[field_name]

  if !existing_field || (type && !existing_field.type?(type))
    fields_hash[field_name] = if model.new.respond_to?(field_name)
      build_field_for(field_name, type)
    else
      raise NoMethodError.new(
        "No attribute or method correspond to ##{ field_name } " +
        "in the model #{ model.name }. No field could be created."
      )
    end
  else
    existing_field
  end
end
fields() click to toggle source
# File lib/para/attribute_field_mappings.rb, line 20
def fields
  fields_hash.values
end

Private Instance Methods

build_field_for(attribute_name, type) click to toggle source
# File lib/para/attribute_field_mappings.rb, line 64
def build_field_for(attribute_name, type)
  field_class = field_class_for(type)
  field_class.new(model, name: attribute_name, type: type)
end
field_class_for(type) click to toggle source
# File lib/para/attribute_field_mappings.rb, line 69
def field_class_for(type)
  attribute_class = type && AttributeField::Base.field_types[type.to_sym]
  attribute_class || AttributeField::Base
end
process_fields!() click to toggle source
# File lib/para/attribute_field_mappings.rb, line 47
def process_fields!
  @fields_hash = model.columns.each_with_object({}) do |column, fields|
    next unless whitelisted?(column.name)

    # Reject uneditable attributes
    unless UNEDITABLE_ATTRIBUTES.include?(column.name)
      field_class = field_class_for(column.type)

      fields[column.name] = field_class.new(
        model, name: column.name, type: column.type
      )
    end
  end.with_indifferent_access

  Para::ModelFieldParsers.parse!(model, fields_hash, mappings)
end
whitelisted?(attribute_name) click to toggle source
# File lib/para/attribute_field_mappings.rb, line 43
def whitelisted?(attribute_name)
  !whitelist_attributes || whitelist_attributes.include?(attribute_name)
end