Module: FieldHelpers::ClassMethods

Defined in:
lib/volt/models/field_helpers.rb

Instance Method Summary collapse

Instance Method Details

#field(name, klasses = nil, options = {}) ⇒ Object

field lets you declare your fields instead of using the underscore syntax. An optional class restriction can be passed in.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/volt/models/field_helpers.rb', line 40

def field(name, klasses = nil, options = {})
  if klasses
    klasses = [klasses].flatten

    unless klasses.any? {|kl| FIELD_CASTS.key?(kl) }
      klass_names = FIELD_CASTS.keys.map(&:to_s).join(', ')
      msg = "valid field types is currently limited to #{klass_names}, you passed: #{klasses.inspect}"
      fail FieldHelpers::InvalidFieldClass, msg
    end

    # Add NilClass as an allowed type unless allow_nil: false was passed.
    unless options[:allow_nil] == false
      klasses << NilClass
    end
  end

  self.fields_data ||= {}
  self.fields_data[name] = [klasses, options]

  if klasses
    # Add type validation, execpt for String, since anything can be cast to
    # a string.
    unless klasses.include?(String)
      validate name, type: klasses
    end
  end

  define_method(name) do
    get(name)
  end

  define_method(:"#{name}=") do |val|
    # Check if the value assigned matches the class restriction
    if klasses
      # Cast to the right type
      klasses.each do |kl|
        if (func = FIELD_CASTS[kl])
          # Cast on the first available caster
          val = func[val]
          break
        end
      end
    end

    set(name, val)
  end
end