Как легко анализировать 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
, но я не могу его найти.
Спасибо:)
Ответы
Ответ 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.