【问题标题】:How do I easily parse a URL with parameters in a Rails test?如何在 Rails 测试中轻松解析带有参数的 URL?
【发布时间】:2014-12-18 23:23:02
【问题描述】:

我有一些代码将 return_to URL 嵌入到我想要测试的重定向(如 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 的params 部分,然后在/&|?/ 上拆分它,然后在'=' 上再次拆分,但我希望这已经为我完成了。另外,如果我在 URL 转义或参数解析中遗漏了一些晦涩的规则怎么办? 必须在ActionPack 或ActiveSupport 中有一些东西可以做到这一点,但我找不到。

谢谢:)

【问题讨论】:

    标签: ruby-on-rails ruby testing url parsing


    【解决方案1】:

    CGI::parse(querystring) 会将查询字符串解析为哈希。然后,CGI::unescape(string) 将撤消值中的任何 URL 编码。

    或者,如果您使用的是基于 Rack 的最新版本的 Rails,并且想要超级现代,您可以使用 Rack::Utils.parse_query 和 Rack::Utils.unescape。

    我不知道有任何 Rails 特定的辅助方法包装了这些实用函数,但它们使用起来非常简单,而且 CGI 或 Rack 已经加载到 Rails 环境中了。

    【讨论】:

    • CGI::parse 将所有值包装在一个数组中。 +1 为 Rack::Utils.parse_query
    • CGI::parse 处理您有时会在 URL 中看到的错误字符,rack parse_query 将在 {,},',", ... 上失败。
    • 如果你有嵌套查询,试试Rack::Utils.parse_nested_query(q): Rack::Utils.parse_nested_query 'foo=1&bar%5Bbaz%5D=baz' => {"foo"=>"1", "bar"=>{"baz"=>"baz"}}
    • 在 ruby​​ 2.2 上,我看到 CGI::parse 进行自动 URL 解码,因此额外的 unescape 可以完成双倍的工作,并且在极端情况下会产生错误的结果
    【解决方案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 解析器)抛出异常。

    【讨论】:

    • 您作为维护者有偏见,我不是而且宁愿使用它而不是其他任何东西。美妙的宝石,感谢您的帮助。
    • 感谢您的客气话。多年来,我们一直在努力构建和改进它。
    • Addressable 是 URI 实现的替代品,它是 Ruby 标准库的一部分。 Ruby 1.8.x、1.9.x 和 JRuby 中的可寻址工作。
    猜你喜欢
    • 2011-11-10
    • 2012-12-22
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多