class ActionController::MimeResponds::Collector
A container for responses available from the current controller for requests for different mime-types sent to a particular action.
The public controller methods respond_to
may be called with a block that is used to define responses to different mime-types, e.g. for respond_to
:
respond_to do |format|
format.html
format.xml { render xml: @people }
end
In this usage, the argument passed to the block (format
above) is an instance of the ActionController::MimeResponds::Collector
class. This object serves as a container in which available responses can be stored by calling any of the dynamically generated, mime-type-specific methods such as html
, xml
etc on the Collector. Each response is represented by a corresponding block if present.
A subsequent call to negotiate_format(request)
will enable the Collector to determine which specific mime-type it should respond with for the current request, with this response then being accessible by calling response
.
Inherits From
Attributes
[RW] | format |
Public class methods
Source code GitHub
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 255
def initialize(mimes, variant = nil)
@responses = {}
@variant = variant
mimes.each { |mime| @responses[Mime[mime]] = nil }
end
Public instance methods
Alias for:
any
.
Also aliased as:
all
.
Source code GitHub
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 262
def any(*args, &block)
if args.any?
args.each { |type| send(type, &block) }
else
custom(Mime::ALL, &block)
end
end
Source code GitHub
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 280
def any_response?
!@responses.fetch(format, false) && @responses[Mime::ALL]
end
Source code GitHub
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 271
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
Source code GitHub
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 297
def negotiate_format(request)
@format = request.negotiate_mime(@responses.keys)
end
Source code GitHub
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 284
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