Alternar dinamicamente respondedores de Rails

Precisa ser capaz de suportar comportamentos de resposta totalmente diferentes dinamicamente?

Os objetos respondentes respondem a #call, assim como procs e lambdas.

Está confuso? Vamos ler um código abreviado de trilhos.

def respond_with(*resources, &block)
# respond_with stuff
(options.delete(:responder) || self.class.responder).call(self, resources, options)
end

A última linha de código em #respond_with procura por nosso respondente e liga para #call.

Em nosso método sobrescrito, retornamos um lambda com recebe a mensagem #call e os argumentos.

class SpecialResponderController < ActionController::Base
protected
def self.responder
lambda do |controller, resources, options|
if controller.is_special?
SpecialResponder.call(controller, resources, options)
else
super.call(controller, resources, options)
end
end
end
end

Como um desses argumentos é o controlador de nossa solicitação, podemos usar métodos de instância públicos do controlador para informar o comportamento de nosso respondente.

Espero que seja útil.