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.call
e, embora funcionasse bem no console, tive um problema ao executá-la durante uma solicitação real devido a Rack::Lock
problemas de bloqueio.
A abordagem final envolve pular o middleware Rack (que inclui Rack::Lock
ser 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.