9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/noyo_fulfillment/models/mixins/nested_under.rb', line 9
def nested_under(resource_klass, required: true)
class_name = resource_klass.class_name
parent_resource = class_name.underscore.downcase
singleton_class.send(:define_method, :parent_path) do |parent_resource_id|
resource_klass.single_resource_url(parent_resource_id)
end
define_method :create_url do
parent_path = self.class.parent_path(send("#{parent_resource}_id"))
[ parent_path, self.class.resource_path_name ].join('/')
end
define_method :single_resource_url do
option_value = send("#{parent_resource}_id")
options = { "#{parent_resource}_id".to_sym => option_value }
self.class.single_resource_url(id, options)
end
singleton_class.send(:define_method, :single_resource_url) do |id, **args|
parent_resource_id = args["#{parent_resource}_id".to_sym]
if parent_resource_id.nil? && required
raise "Need an #{parent_resource} ID passed in the arguments."
end
if !parent_resource_id.nil? || required
[ parent_path(parent_resource_id), resource_path_name, id ].join('/')
else
[ resource_url, id ].join('/')
end
end
define_method :resource_url do
option_value = send("#{parent_resource}_id")
options = { "#{parent_resource}_id".to_sym => option_value }
self.class.resource_url(options)
end
singleton_class.send(:define_method, :resource_url) do |**args|
parent_resource_id = args["#{parent_resource}_id".to_sym]
if parent_resource_id.nil? && required
raise "Need an #{parent_resource} ID passed in the arguments."
end
if !parent_resource_id.nil? || required
[ parent_path(parent_resource_id), resource_path_name ].join('/')
else
"/api/v1/#{resource_path_name}"
end
end
end
|