Class: Toast::Resource
- Inherits:
-
Object
- Object
- Toast::Resource
- Defined in:
- lib/toast/resource.rb
Overview
Represents a resource. There are following resource types as sub classes: Record, RootCollection, AssociateCollection, Attribute
Direct Known Subclasses
Instance Attribute Summary collapse
-
#media_type ⇒ Object
Returns the value of attribute media_type.
Class Method Summary collapse
Instance Method Summary collapse
- #apply(method, payload) ⇒ Object
-
#initialize ⇒ Resource
constructor
A new instance of Resource.
Constructor Details
#initialize ⇒ Resource
Returns a new instance of Resource.
15 16 17 |
# File 'lib/toast/resource.rb', line 15 def initialize raise 'ToastResource#new: use #build to create an instance' end |
Instance Attribute Details
#media_type ⇒ Object
Returns the value of attribute media_type.
13 14 15 |
# File 'lib/toast/resource.rb', line 13 def media_type @media_type end |
Class Method Details
.build(params, request) ⇒ Object
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 |
# File 'lib/toast/resource.rb', line 19 def self.build params, request resource_name = params[:resource] id = params[:id] subresource_name = params[:subresource] format = params[:format] begin model = get_class_by_resource_name resource_name # base is complete URL until the resource name model.uri_base = request.url.match(/(.*)\/#{resource_name}(?:\..+|\/|\z)/)[1] # decide which sub type rsc = if id.nil? and model.toast_config.singles.include?(subresource_name) Toast::Single.new(model, subresource_name, params.clone) elsif id.nil? Toast::RootCollection.new(model, subresource_name, params.clone) elsif subresource_name.nil? Toast::Record.new(model, id, format) elsif model.toast_config.exposed_associations.include? subresource_name Toast::Association.new(model, id, subresource_name, format) elsif model.toast_config.exposed_attributes.include? subresource_name Toast::Attribute.new(model, id, subresource_name, format) else raise ResourceNotFound end rsc.media_type = request.media_type rsc rescue NameError raise ResourceNotFound end end |
.get_class_by_resource_name(name) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/toast/resource.rb', line 56 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) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/toast/resource.rb', line 71 def apply method, payload raise MethodNotAllowed if self.model.toast_config.disallow_methods.include?(method.downcase) case method when "PUT","POST" self.send(method.downcase, ActiveSupport::JSON.decode(payload)) when "DELETE","GET" self.send(method.downcase) else raise MethodNotAllowed end end |