1
0
Fork 0
mirror of https://github.com/sinatra/sinatra synced 2023-03-27 23:18:01 -04:00

respond_to

This commit is contained in:
blake.mizerany@gmail.com 2007-09-14 04:07:56 +00:00
parent 0cfd1b78ae
commit 33fea0f5ac
2 changed files with 45 additions and 0 deletions

3
vendor/responder/init.rb vendored Normal file
View file

@ -0,0 +1,3 @@
require File.dirname(__FILE__) + '/lib/responder'
Sinatra::EventContext.send(:include, Sinatra::Responder)

42
vendor/responder/lib/responder.rb vendored Normal file
View file

@ -0,0 +1,42 @@
# taken from Cheat
# get '/foo/(\w+)'
# ... important code ...
#
# respond_to do |wants|
# wants.html { render :something }
# wants.text { "Just some text." }
# wants.yaml { "Something neat!".to_yaml }
# wants.xml { "Also, XML.".to_xml }
# end
# end
module Sinatra
module Responder
def respond_to
yield response = Response.new(request.env["HTTP_ACCEPT"])
headers 'Content-Type' => response.content_type
body response.body
end
class Response
attr_reader :body, :content_type
def initialize(accept) @accept = accept end
TYPES = {
:yaml => %w[application/yaml text/yaml],
:text => %w[text/plain],
:html => %w[text/html */* application/html],
:xml => %w[application/xml],
:json => %w[application/json]
}
def method_missing(method, *args)
if TYPES[method] && @accept =~ Regexp.union(*TYPES[method])
@content_type = TYPES[method].first
@body = yield if block_given?
end
end
end
end
end