class ActionController::MimeResponds::Collector

request, with this response then being accessible by calling #response.
determine which specific mime-type it should respond with for the current
A subsequent call to #negotiate_format(request) will enable the Collector to
block if present.
‘xml` etc on the Collector. Each response is represented by a corresponding
any of the dynamically generated, mime-type-specific methods such as `html`,
serves as a container in which available responses can be stored by calling
instance of the ActionController::MimeResponds::Collector class. This object
In this usage, the argument passed to the block (`format` above) is an
end
format.xml { render xml: @people }
format.html
respond_to do |format|
used to define responses to different mime-types, e.g. for `respond_to` :
The public controller methods `respond_to` may be called with a block that is
for different mime-types sent to a particular action.
A container for responses available from the current controller for requests

def any(*args, &block)

def any(*args, &block)
  if args.any?
    args.each { |type| send(type, &block) }
  else
    custom(Mime::ALL, &block)
  end
end

def any_response?

def any_response?
  !@responses.fetch(format, false) && @responses[Mime::ALL]
end

def custom(mime_type, &block)

def custom(mime_type, &block)
  mime_type = Mime::Type.lookup(mime_type.to_s) unless mime_type.is_a?(Mime::Type)
  @responses[mime_type] ||= if block_given?
    block
  else
    VariantCollector.new(@variant)
  end
end

def initialize(mimes, variant = nil)

def initialize(mimes, variant = nil)
  @responses = {}
  @variant = variant
  mimes.each { |mime| @responses[Mime[mime]] = nil }
end

def negotiate_format(request)

def negotiate_format(request)
  @format = request.negotiate_mime(@responses.keys)
end

def response

def response
  response = @responses.fetch(format, @responses[Mime::ALL])
  if response.is_a?(VariantCollector) # `format.html.phone` - variant inline syntax
    response.variant
  elsif response.nil? || response.arity == 0 # `format.html` - just a format, call its block
    response
  else # `format.html{ |variant| variant.phone }` - variant block syntax
    variant_collector = VariantCollector.new(@variant)
    response.call(variant_collector) # call format block with variants collector
    variant_collector.variant
  end
end