Class: Toast::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/toast/resource.rb

Overview

Represents a resource. There are following resource types as sub classes: Record, Collection, Association, Single

Direct Known Subclasses

Association, Collection, Record, Single

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeResource

Returns a new instance of Resource.



19
20
21
# File 'lib/toast/resource.rb', line 19

def initialize
  raise 'ToastResource#new: use #build to create an instance'
end

Instance Attribute Details

#base_uriObject

Returns the value of attribute base_uri.



17
18
19
# File 'lib/toast/resource.rb', line 17

def base_uri
  @base_uri
end

#payload_content_typeObject

Returns the value of attribute payload_content_type.



17
18
19
# File 'lib/toast/resource.rb', line 17

def payload_content_type
  @payload_content_type
end

#prefered_media_typeObject

Returns the value of attribute prefered_media_type.



17
18
19
# File 'lib/toast/resource.rb', line 17

def prefered_media_type
  @prefered_media_type
end

Class Method Details

.build(params, request) ⇒ Object



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
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
# File 'lib/toast/resource.rb', line 23

def self.build params, request
  resource_name = params[:resource]
  id = params[:id]
  subresource_name = params[:subresource]
  format = params[:format]

  begin

    # determine model
    model = get_class_by_resource_name resource_name

    # determine config for representation
    #  config_in: cosumed representation
    #  config_out: produced representation
    config_out = model.toast_config request.accept_media_types.prefered
    config_in = model.toast_config request.media_type

    #  ... or in case of an association request
    config_assoc_src = model.toast_config request.headers["Assoc-source-type"] # ?

    # base URI for returned object
    base_uri = request.base_url + request.script_name +
      (config_out.namespace ? "/" + config_out.namespace : "")

    # decide which sub resource type
    rsc = if id.nil? and config_out.singles.include?(subresource_name)
            Toast::Single.new(model, subresource_name, params.clone, config_in, config_out)
          elsif id.nil?
            Toast::Collection.new(model, subresource_name, params.clone, config_in, config_out)
          elsif subresource_name.nil?
            Toast::Record.new(model, id, format, params.clone, config_in, config_out)
          elsif (config_assoc_src && config_assoc_src.exposed_associations.include?(subresource_name))

            # determine associated model
            assoc_model =
              model.reflect_on_all_associations.detect{|a| a.name.to_s == subresource_name}.klass

            # determine config for representation of assoc. model
            assoc_config_out = assoc_model.toast_config request.accept_media_types.prefered
            assoc_config_in = assoc_model.toast_config request.media_type

            # change base URI to associated record
            base_uri = request.base_url + request.script_name +
              (assoc_config_out.namespace ? "/" + assoc_config_out.namespace : "")


            Toast::Association.new(model, id, subresource_name, params.clone, format, config_assoc_src,
                                   assoc_model, assoc_config_in, assoc_config_out)

          else
            raise ResourceNotFound
          end

    # set base to be prepended to URIs
    rsc.base_uri = base_uri



    rsc
  rescue NameError
    raise ResourceNotFound
  end
end

.get_class_by_resource_name(name) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/toast/resource.rb', line 87

def self.get_class_by_resource_name name
  begin
    model = name.singularize.classify.constantize # raises NameError

    unless ((model.superclass == ActiveRecord::Base) and model.is_resourceful_model?)
      raise ResourceNotFound
    end

    model

  rescue NameError
    raise ResourceNotFound
  end
end

Instance Method Details

#apply(method, payload, payload_media_type, link_path_info) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/toast/resource.rb', line 102

def apply method, payload, payload_media_type, link_path_info
  case method
  when "PUT","POST"
    if link_path_info
      self.link link_path_info
    else
      self.send(method.downcase, payload, payload_media_type)
    end
  when "DELETE"
    if link_path_info
      self.unlink link_path_info
    else
      self.delete
    end
  when "GET"
    self.get
  else
    raise MethodNotAllowed
  end
end