是否有基于一组参数生成URL的Ruby库/ gem?

时间:2011-05-27 12:27:39

标签: ruby-on-rails ruby gem

Rails的URL生成机制(大多数在某些时候通过polymorphic_url路由)允许将至少为GET请求序列化的哈希传递到查询字符串中。获得这种功能的最佳方法是什么,但是在任何基本路径之上?

例如,我希望得到以下内容:

generate_url('http://www.google.com/', :q => 'hello world')
  # => 'http://www.google.com/?q=hello+world'

我当然可以编写自己的,完全符合我的应用程序的要求,但如果存在一些规范库来处理它,我宁愿使用它:)。

4 个答案:

答案 0 :(得分:37)

是的,在Ruby的标准库中,您将找到用于处理URI的整个类模块。有一个用于HTTP。您可以使用一些参数调用#build,就像您展示的那样。

http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/HTTP.html#M009497

对于查询字符串本身,只需使用Rails的哈希加法#to_query。即。

uri = URI::HTTP.build(:host => "www.google.com", :query => { :q => "test" }.to_query)

答案 1 :(得分:3)

晚会,但我强烈推荐Addressable宝石。除了其他有用的功能外,它还支持通过RFC 6570 URI templates编写和解析uri。要调整给定的示例,请尝试:

gsearch = Addressable::Template.new('http://google.com/{?query*}')
gsearch.expand(query: {:q => 'hello world'}).to_s
# => "http://www.google.com/?q=hello%20world"

gsearch = Addressable::Template.new('http://www.google.com/{?q}')
gsearch.expand(:q => 'hello world').to_s
# => "http://www.google.com/?q=hello%20world"

答案 2 :(得分:2)

对于 vanilla Ruby,使用 URI.encode_www_form

require 'uri'
query = URI.encode_www_form({ :q => "test" })
url = URI::HTTP.build(:host => "www.google.com", query: query).to_s
#=> "http://www.google.com?q=test"

答案 3 :(得分:0)

我建议使用iri的gem,它可以很容易地通过流畅的界面构建URL:

require 'iri'
url = Iri.new('http://google.com/')
  .append('find').append('me') # -> http://google.com/find/me
  .add(q: 'books about OOP', limit: 50) # -> ?q=books+about+OOP&limit=50
  .del(:q) # remove this query parameter
  .del('limit') # remove this one too
  .over(q: 'books about tennis', limit: 10) # replace these params
  .scheme('https') # replace 'http' with 'https'
  .host('localhost') # replace the host name
  .port('443') # replace the port
  .path('/new/path') # replace the path of the URI, leaving the query untouched
  .cut('/q') # replace everything after the host and port
  .to_s # convert it to a string