Permalink
Browse files

respond_to

  • Loading branch information...
1 parent 0cfd1b7 commit 33fea0f5ac5f727ef9cbe7b4e7621c55a18ab600 blake.mizerany@gmail.com committed Sep 14, 2007
Showing with 45 additions and 0 deletions.
  1. +3 −0 vendor/responder/init.rb
  2. +42 −0 vendor/responder/lib/responder.rb
View
@@ -0,0 +1,3 @@
+require File.dirname(__FILE__) + '/lib/responder'
+
+Sinatra::EventContext.send(:include, Sinatra::Responder)
@@ -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

0 comments on commit 33fea0f

Please sign in to comment.