Rails – Pedidos Internos

Eu precisava realizar uma requisição interna no Rails, ou seja, obter o resultado de uma requisição durante outra requisição com alto nível de isolamento e sem recorrer a medidas ingênuas / onerosas (ou seja, realizar uma requisição Net :: HTTP contra o aplicativo local).

Originalmente, tentei uma abordagem que funcionou bem Rails.application.calle, embora funcionasse bem no console, tive um problema ao executá-la durante uma solicitação real devido a Rack::Lockproblemas de bloqueio.

A abordagem final envolve pular o middleware Rack (que inclui Rack::Lockser invocado) e pode ser executado durante uma solicitação (ou por meio do console sem a fusão da sessão) para uma solicitação interna altamente isolada. Minha implementação atual é assim:

def internal_request(path, params={})
request_env
= Rack::MockRequest.env_for(path, params: params.to_query).merge({
'rack.session' => session # remove if session is unavailable/undesired in request
})

# Returns: [ status, headers, body ]
Rails.application.routes.call(request_env)
end

Os agradecimentos vão para Sam Pohlenz por como ele resolveu um problema muito semelhante, bem como suas percepções sobre o Rack.