Module: FieldHelpers::ClassMethods
- Defined in:
- lib/volt/models/field_helpers.rb
Instance Method Summary collapse
-
#field(name, klasses = nil, options = {}) ⇒ Object
field lets you declare your fields instead of using the underscore syntax.
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, = {}) 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 [:allow_nil] == false klasses << NilClass end end self.fields_data ||= {} self.fields_data[name] = [klasses, ] 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 |