module Respond
A controller layer which provides a convenient way to respond to different requested content types. The order in which you add converters matters, as it determines how the incoming Accept: header is mapped, e.g. the first converter is also defined as matching the media range /.
Classes and Modules
module ClassMethodsDefines response handlers on controller classes.
Definitions
def self.prepended(base)
Extend a controller class with response negotiation.
Signature
-
parameter
baseClass The controller class.
-
returns
Class The extended controller class.
Implementation
def self.prepended(base)
base.extend(ClassMethods)
end
def response_for(request, result)
Build a protocol response for a semantic controller result.
Signature
-
parameter
requestUtopia::Request The request.
-
parameter
resultController::Result The semantic controller result.
-
returns
Protocol::HTTP::Response The response.
Implementation
def response_for(request, result)
if response = self.class.response_for(self, request, result.value)
content_type, body = response
headers = result.headers.dup
if content_type
headers[HTTP::CONTENT_TYPE] = content_type.to_s
end
return Utopia::Response[result.status, headers, body]
end
raise TypeError, "Could not negotiate a response for #{result.value.class}!"
end
def process!(request, path)
Serialize semantic controller results, while passing complete protocol responses through unchanged.
Implementation
def process!(request, path)
result = super
case result
when Result
return self.response_for(request, result)
else
return result
end
end