Class: Taksi::Components::Field
- Inherits:
-
Object
- Object
- Taksi::Components::Field
show all
- Defined in:
- lib/taksi/components/field.rb
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(skeleton, name, *args, parent: nil, &block) ⇒ Field
Returns a new instance of Field.
8
9
10
11
12
13
14
15
16
17
18
|
# File 'lib/taksi/components/field.rb', line 8
def initialize(skeleton, name, *args, parent: nil, &block)
@skeleton = skeleton
@name = name.to_sym
@parent = parent
@value = args.shift.new(skeleton, name, *args) if args.size.positive?
@nested_fields = []
instance_exec(&block) if block_given?
@defined = true
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
62
63
64
65
66
|
# File 'lib/taksi/components/field.rb', line 62
def method_missing(name, *args, &block)
return super if @defined
@nested_fields << self.class.new(skeleton, name, *args, parent: self, &block)
end
|
Instance Attribute Details
#name ⇒ Object
Returns the value of attribute name.
6
7
8
|
# File 'lib/taksi/components/field.rb', line 6
def name
@name
end
|
#parent ⇒ Object
Returns the value of attribute parent.
6
7
8
|
# File 'lib/taksi/components/field.rb', line 6
def parent
@parent
end
|
#skeleton ⇒ Object
Returns the value of attribute skeleton.
6
7
8
|
# File 'lib/taksi/components/field.rb', line 6
def skeleton
@skeleton
end
|
#value ⇒ Object
Returns the value of attribute value.
6
7
8
|
# File 'lib/taksi/components/field.rb', line 6
def value
@value
end
|
Instance Method Details
#as_json ⇒ Object
36
37
38
39
40
|
# File 'lib/taksi/components/field.rb', line 36
def as_json
return {name => @nested_fields.map(&:as_json).inject({}, &:merge)} if nested?
{name => value.as_json}
end
|
#fetch_from(data) ⇒ Object
26
27
28
29
30
31
32
33
34
|
# File 'lib/taksi/components/field.rb', line 26
def fetch_from(data)
return value.as_json if value.static?
return data[name] if parent.nil? || parent.root?
parent.fetch_from(data)[name]
rescue NoMethodError
raise NameError, "Couldn't fetch #{key.inspect} from data: #{data.inspect}"
end
|
#fields ⇒ Object
42
43
44
45
46
47
48
49
50
51
52
|
# File 'lib/taksi/components/field.rb', line 42
def fields
Enumerator.new do |yielder|
@nested_fields.each do |field|
if field.nested?
field.fields.each(&yielder)
else
yielder << field
end
end
end
end
|
#key ⇒ Object
20
21
22
23
24
|
# File 'lib/taksi/components/field.rb', line 20
def key
return name if parent.nil? || parent.root?
"#{parent.name}.#{name}"
end
|
#nested? ⇒ Boolean
54
55
56
|
# File 'lib/taksi/components/field.rb', line 54
def nested?
@value.nil?
end
|
#respond_to_missing?(name) ⇒ Boolean
68
69
70
71
72
|
# File 'lib/taksi/components/field.rb', line 68
def respond_to_missing?(name)
return super if @defined
true
end
|
#root? ⇒ Boolean
58
59
60
|
# File 'lib/taksi/components/field.rb', line 58
def root?
@parent.nil?
end
|