Sha256: 34f31a4596fb310d729b816b6481ba5c4447c40274b7cf2c3e6e5f0c3e39be0d

Contents?: true

Size: 1.46 KB

Versions: 2

Compression:

Stored size: 1.46 KB

Contents

require 'active_support/time_with_zone'

module Formulaic
  class Form
    ATTRIBUTE_INPUT_MAP = {
      ActiveSupport::TimeWithZone => Formulaic::Inputs::DateInput,
      Date => Formulaic::Inputs::DateInput,
      DateTime => Formulaic::Inputs::DateTimeInput,
      Array => Formulaic::Inputs::ArrayInput,
      String => Formulaic::Inputs::StringInput,
      Symbol => Formulaic::Inputs::StringInput,
      1.class => Formulaic::Inputs::StringInput,
      Float => Formulaic::Inputs::StringInput,
      TrueClass => Formulaic::Inputs::BooleanInput,
      FalseClass => Formulaic::Inputs::BooleanInput,
      File => Formulaic::Inputs::FileInput,
    }.freeze

    def initialize(model_name, action, attributes)
      @action = action
      @inputs = build_inputs(model_name, attributes)
    end

    def fill
      @inputs.each { |input| input.fill }
    end

    private

    attr_reader :model_name, :inputs, :action

    def build_inputs(model_name, attributes)
      attributes.map do |field, value|
        build_input(model_name, field, value)
      end
    end

    def build_input(model_name, field, value)
      label = Label.new(model_name, field, action)
      input_class_for(value).new(label, value)
    end

    def input_class_for(value)
      ATTRIBUTE_INPUT_MAP.fetch(value.class) do
        raise InvalidAttributeTypeError.new("Formulaic does not know how to fill in a #{value.class} value")
      end
    end

    class InvalidAttributeTypeError < StandardError; end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
formulaic-0.4.1 lib/formulaic/form.rb
formulaic-0.4.0 lib/formulaic/form.rb