Как мне легко разобрать URL с параметрами в тесте Rails? - PullRequest
17 голосов
/ 27 мая 2009

У меня есть некоторый код, который вставляет URL return_to в редирект (например, OpenID), который я хочу проверить:

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

Это Rails ActionController::TestCase, поэтому у меня есть доступ ко всем видам вспомогательных методов; Я просто не могу найти правильный.

Конечно, я мог бы использовать URI.parse, чтобы получить часть параметров URL-адреса, затем разделить ее на /&|?/, а затем снова разделить на '=', но я надеюсь, что это уже сделано для меня. Кроме того, что если я пропущу какое-то непонятное правило в экранировании URL или разборе параметров? Там имеет , чтобы быть в ActionPack или ActiveSupport, чтобы сделать это, но я не могу найти это.

Спасибо:)

Ответы [ 2 ]

41 голосов
/ 27 мая 2009

CGI::parse(querystring) будет анализировать строку запроса в хеш. Тогда CGI::unescape(string) отменит любую URL-кодировку в значении.

В качестве альтернативы вы можете использовать Rack::Utils.parse_query и Rack::Utils.unescape, если вы используете последнюю версию Rails для Rack и хотите быть суперсовременной.

Мне неизвестны какие-либо вспомогательные методы Rails, которые оборачивают эти служебные функции, но они довольно просты в использовании, и CGI или Rack уже загружены в среду Rails.

27 голосов
/ 03 июня 2009

Вы хотите Адресуемый для этого.

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"

Он автоматически обрабатывает все правила перехода для вас и имеет некоторые другие полезные функции, такие как не исключение исключений для совершенно корректных, но неясных URI, таких как встроенный анализатор URI.

...