Sha256: 431f06a67adb0ba39f97094151fd6d743f7c9fee4c61c1fdb13f2aa1740dfe6b

Contents?: true

Size: 1.32 KB

Versions: 4

Compression:

Stored size: 1.32 KB

Contents

require 'active_support/time_with_zone'

module Formulaic
  class Form
    ATTRIBUTE_INPUT_MAP = {
      ActiveSupport::TimeWithZone => Formulaic::Inputs::DateInput,
      Date => Formulaic::Inputs::DateInput,
      Array => Formulaic::Inputs::ArrayInput,
      String => Formulaic::Inputs::StringInput,
      Fixnum => 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

4 entries across 4 versions & 1 rubygems

Version Path
formulaic-0.1.3 lib/formulaic/form.rb
formulaic-0.1.2 lib/formulaic/form.rb
formulaic-0.1.1 lib/formulaic/form.rb
formulaic-0.1.0 lib/formulaic/form.rb