Rails的URL生成机制(大多数在某些时候通过polymorphic_url
路由)允许将至少为GET请求序列化的哈希传递到查询字符串中。获得这种功能的最佳方法是什么,但是在任何基本路径之上?
例如,我希望得到以下内容:
generate_url('http://www.google.com/', :q => 'hello world')
# => 'http://www.google.com/?q=hello+world'
我当然可以编写自己的,完全符合我的应用程序的要求,但如果存在一些规范库来处理它,我宁愿使用它:)。
答案 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