Class: JsonApi::Resources::Discovery

Inherits:
Object
  • Object
show all
Defined in:
lib/json_api_ruby/resources/discovery.rb

Class Method Summary collapse

Class Method Details

.resource_class(model_name, namespace:, parent:) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/json_api_ruby/resources/discovery.rb', line 30

def self.resource_class(model_name, namespace:, parent:)
  if namespace
    klass = [
      namespace.to_s.underscore,
      "#{model_name.to_s.underscore}_resource"
    ].join('/').classify
  else
    klass = resource_path(model_name, parent).join.classify
  end
  klass
end

.resource_for_name(model, options = {}) ⇒ Object



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
# File 'lib/json_api_ruby/resources/discovery.rb', line 4

def self.resource_for_name(model, options={})
  @discovered_classes ||= {}
  klass = options.fetch(:resource_class, nil)

  # Duck typing. If klass responds to :new, we assume it's a class
  return klass if klass.respond_to?(:new)

  namespace = options.fetch(:namespace, nil)
  parent = options.fetch(:parent_resource, nil)

  if klass.blank?
    cached_class = @discovered_classes[model.class.to_s]
    if cached_class.blank?
      klass = resource_class(model.class.to_s.underscore, namespace: namespace, parent: parent)
    else
      return cached_class
    end
  end

  const = Object.const_get(klass)
  @discovered_classes[model.class.to_s] ||= const
  const
rescue NameError
  fail ::JsonApi::ResourceNotFound.new("Could not find resource class `#{klass}'")
end

.resource_path(model_name, parent) ⇒ Object



42
43
44
45
46
47
48
# File 'lib/json_api_ruby/resources/discovery.rb', line 42

def self.resource_path(model_name, parent)
  current_namespace = parent.class.to_s.underscore.split('/')
  current_namespace.pop
  current_namespace << '/' if current_namespace.present?
  current_namespace << "#{model_name.to_s}_resource"
  current_namespace
end