2009-05-27 14 views
16

tengo un cierto código que incrusta una URL return_to en una redirección (como OpenID) que yo quiero hacer la prueba:¿Cómo puedo analizar fácilmente una URL con parámetros en una prueba de Rails?

def test_uses_referrer_for_return_to 
    expected_return_to = 'http://test.com/foo' 
    @request.env['HTTP_REFERER'] = expected_return_to 
    get :fazbot 
    # @response.redirected_to looks like http://service.com?...&return_to=[URI-encoded version of URL above]&... 
    encoded_return_to = (something_here)[:return_to] 
    assert_equal expected_return_to, URI.unencode(encoded_return_to) 
end 

Es un Rieles ActionController::TestCase, así que tengo acceso a todo tipo de métodos de ayuda; Simplemente no puedo encontrar el correcto.

Por supuesto que podría utilizar para obtener URI.parse la parte params de la URL, luego se dividió en /&|?/ y luego se divide otra vez en '=', pero espero que esto ya está hecho para mí. Además, ¿qué pasa si omito alguna regla oscura en el escape de URL o en el análisis de parámetros? No tiene para ser algo en ActionPack o ActiveSupport para hacer esto, pero no puedo encontrarlo.

Gracias :)

Respuesta

41

CGI::parse(querystring) analizará una cadena de consulta en un hash. Luego, CGI::unescape(string) deshará cualquier codificación URL en el valor.

O bien, puede usar Rack::Utils.parse_query y Rack::Utils.unescape si está utilizando una versión reciente de Rails basada en Rack y desea ser súper moderno.

No conozco ningún método de ayuda específico de Rails que envuelva estas funciones de utilidad, pero son bastante simples de usar, y CGI o Rack ya están cargados en el entorno Rails de todos modos.

+8

CGI :: parse ajusta todos los valores en una matriz. +1 para Rack :: Utils.parse_query – zaius

+0

CGI :: el análisis maneja los caracteres incorrectos que a veces ve en las URL, el parse_query del rack fallará en {,}, ', ", ... –

+3

Si ha anidado la consulta, pruébelo a 'Rack :: Utils.parse_nested_query (q)': 'Rack :: Utils.parse_nested_query 'foo = 1 & bar% 5Bbaz% 5D = baz'' =>' {"foo" => "1", "barra" => {"baz" => "baz"}} ' – sequielo

26

Quiere Addressable para esto.

uri = Addressable::URI.parse("http://example.com/?var=value") 
uri.query_values # => {"var"=>"value"} 
uri.query_values = {"one" => "1", "two" => "2"} 
uri.to_s # => "http://example.com/?two=2&one=1" 

que va a manejar automáticamente todas las reglas de escape para usted, y tiene algunas otras características útiles, como no lanzar excepciones para los URI perfectamente válidas pero oscuros como el analizador incorporado URI.

+2

Usted está predispuesto como mantenedor, no lo soy y preferiría usar esto y luego cualquier otra cosa. Joya maravillosa, gracias por hacerlo realidad. – Kjellski

+1

Gracias por las amables palabras. Han sido bastantes años de trabajo arduo para mejorarla. –

+1

+1 Direccionable es asombroso –

Cuestiones relacionadas