Sha256: a361ee34dc14fa961bdd63c5bc30ad53ef0974a5526bdfeac656c6d600ff8b68

Contents?: true

Size: 1.23 KB

Versions: 3

Compression:

Stored size: 1.23 KB

Contents

require "red_cap/form/fields"
require "active_support/core_ext/string/inflections"

module REDCap
  class Form
    def initialize data_dictionary, responses
      @data_dictionary = data_dictionary
      @responses = responses
    end

    attr_reader :data_dictionary, :responses

    # field accessors
    def method_missing method, *args, **kwargs, &block
      key = method.to_s
      field_class = kwargs[:as]
      if field_class.is_a?(Symbol)
        field_class = lookup_field_class(field_class.to_s)
      end
      if field = find_field(key, field_class)
        field.value
      else
        super
      end
    end

    def find_field key, field_class=nil
      field = fields.find { |field| field.field_name == key }
      field = field_class.new(self, field.attributes, responses) if field_class
      field
    end

    def fields
      @fields ||= data_dictionary.map do |attributes|
        klass = lookup_field_class(attributes["field_type"])
        klass.new(self, attributes, responses)
      end
    end

    private

    def lookup_field_class field_type
      self.class.const_get field_type.camelize, false
    rescue NameError
      puts "Unimplemented field type: #{field_type}. Falling back to Text."
      Text
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
red_cap-0.2.0 lib/red_cap/form.rb
red_cap-0.1.1 lib/red_cap/form.rb
red_cap-0.1.0 lib/red_cap/form.rb