-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
/
resource_collection.rb
42 lines (35 loc) · 1.26 KB
/
resource_collection.rb
1
2
3
4
5
6
7
8
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
module ActiveAdmin
# This is a container for resources, which acts much like a Hash.
# It's assumed that an added resource responds to `resource_name`.
class ResourceCollection
include Enumerable
extend Forwardable
def_delegators :@resources, :empty?, :has_key?, :keys, :values, :[]=
def initialize
@resources = {}
end
def add(resource)
@resources[resource.resource_name] ||= resource
end
# Changes `each` to pass in the value, instead of both the key and value.
def each(&block)
values.each &block
end
# Finds a resource based on the resource name, the resource class, or the base class.
def [](klass)
if match = @resources[klass]
match
elsif match = real_resources.detect{ |r| [r.resource_name.to_s, r.resource_class.to_s].include? klass.to_s }
match
elsif klass.respond_to? :base_class
real_resources.detect{ |r| r.resource_class.to_s == klass.base_class.to_s }
end
end
private
# REFACTOR: ResourceCollection currently stores Resource and Page objects. That doesn't
# make sense, because by definition a ResourceCollection is a collection of resources.
def real_resources
select{ |r| r.respond_to? :resource_class }
end
end
end