aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/mime_responds.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/mime_responds.rb')
-rw-r--r--actionpack/lib/action_controller/mime_responds.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb
new file mode 100644
index 0000000000..7a60a5cc37
--- /dev/null
+++ b/actionpack/lib/action_controller/mime_responds.rb
@@ -0,0 +1,53 @@
+module ActionController #:nodoc:
+ module MimeResponds #:nodoc:
+ def self.included(base)
+ base.send(:include, ActionController::MimeResponds::InstanceMethods)
+ end
+
+ module InstanceMethods
+ def respond_to(&block)
+ responder = Responder.new(block.binding)
+ yield responder
+ responder.respond
+ end
+ end
+
+ class Responder #:nodoc:
+ def initialize(block_binding)
+ @block_binding = block_binding
+ @mime_type_priority = eval("request.accepts", block_binding)
+ @order = []
+ @responses = {}
+ end
+
+ for mime_type in %w( all html js xml rss atom yaml )
+ eval <<-EOT
+ def #{mime_type}(&block)
+ @order << Mime::#{mime_type.upcase}
+ @responses[Mime::#{mime_type.upcase}] = block
+ end
+ EOT
+ end
+
+ def respond
+ for priority in @mime_type_priority
+ if priority == Mime::ALL
+ @responses[@order.first].call
+ return
+ else
+ if @order.include?(priority)
+ @responses[priority].call
+ return # mime type match found, be happy and return
+ end
+ end
+ end
+
+ if @order.include?(Mime::ALL)
+ @responses[Mime::ALL].call
+ else
+ eval 'render(:nothing => true, :status => "406 Not Acceptable")', @block_binding
+ end
+ end
+ end
+ end
+end