6e3e5cadfb
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3841 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
53 lines
1.4 KiB
Ruby
53 lines
1.4 KiB
Ruby
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 |