класс ActionController::MimeResponds::Collector
Контейнер для ответов, доступных из текущего контроллера для запросов с различными типами MIME, отправленных в конкретный метод.
Публичные методы контроллера respond_to могут быть вызваны с блоком, который используется для определения ответов на различные типы MIME, например, для respond_to :
respond_to do |format|
format.html
format.xml { render xml: @people }
end
В этом случае аргумент, переданный в блок (format выше), представляет собой экземпляр класса ActionController::MimeResponds::Collector. Этот объект служит контейнером, в котором доступные ответы могут быть сохранены, вызвав любой из динамически сгенерированных методов, специфичных для типа MIME, таких как html, xml и т. д. на объекте Collector. Каждый ответ представлен соответствующим блоком, если он присутствует.
Следующий вызов negotiate_format(request) позволит Collector определить, какой конкретный тип MIME он должен использовать для ответа на текущий запрос, и этот ответ будет доступен при вызове response.
Атрибуты
Публичные методы класса
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 246
def initialize(mimes, variant = nil)
@responses = {}
@variant = variant
mimes.each { |mime| @responses[Mime[mime]] = nil }
end Публичные методы экземпляра
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 253
def any(*args, &block)
if args.any?
args.each { |type| send(type, &block) }
else
custom(Mime::ALL, &block)
end
end # File actionpack/lib/action_controller/metal/mime_responds.rb, line 271 def any_response? !@responses.fetch(format, false) && @responses[Mime::ALL] end
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 262
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 # File actionpack/lib/action_controller/metal/mime_responds.rb, line 288 def negotiate_format(request) @format = request.negotiate_mime(@responses.keys) end
# File actionpack/lib/action_controller/metal/mime_responds.rb, line 275
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
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.