Подтвердить что ты не робот

Как легко анализировать URL-адрес с параметрами в Rails-тесте?

У меня есть код, который вставляет 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

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

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

Спасибо:)

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы хотите Addressable для этого.

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.