我有一个网址(例如http://www.youtube.com/watch?v=og9B3BEnBHo),我想为它添加一个参数(wmode = opaque),以便它:
http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque
有谁能告诉我使用哪个功能来完成这项工作?
答案 0 :(得分:58)
require 'uri'
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&')
puts uri.to_s
#edit Since 1.9.2 there are methods added to the URI module
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
new_query_ar = URI.decode_www_form(String(uri.query)) << ["wmode", "opaque"]
uri.query = URI.encode_www_form(new_query_ar)
puts uri.to_s
(对String
的调用确保在原始URI没有查询字符串的情况下也可以这样做。)
答案 1 :(得分:17)
随着Ruby多年来的发展,版本之间的答案不同。
Ruby 1.9.2看到decode_www_form
和encode_www_form
添加到URI模块,使编码参数更容易。
require 'uri'
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
new_query_ar = URI.decode_www_form(uri.query || '') << ["wmode", "opaque"]
uri.query = URI.encode_www_form(new_query_ar)
puts uri.to_s
URI.decode_www_form
将一串查询参数(uri.query
)分解为嵌套的参数数组([["v", "og9B3BEnBHo"]]
)
uri.query || ''
提供uri的查询字符串,如果不存在,则提供空字符串。如果decode_www_form
为uri.query
,则可以防止nil
遇到错误。
<< ["wmode", "opaque"]
向查询参数数组添加了另一个元素。您可以通过进一步扩展new_query_ar
:new_query_ar << ["fullscreen", "1"]
URI.encode_www_form
将嵌套数组的新查询参数编码为字符串。
require 'uri'
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&')
puts uri.to_s
[uri.query, "wmode=opaque"]
是所有最终查询参数的数组。您可以通过扩展数组来添加更多内容:[uri.query, "wmode=opaque", "fullscreen=1"]
或添加到最终元素:"wmode=opaque&fullscreen=1"
compact
从数组中删除nil
个元素,因此如果没有现有的查询参数,则会删除uri.query
。
join
将它们连接成一个查询字符串。
答案 2 :(得分:3)
由于您可能要添加多个查询参数,而不仅仅是一个,因此,此版本可让您通过简单地传递一个散列来附加所需的参数,而且散列似乎更自然即使您仅添加一个参数也可以通过params
。
require 'uri'
def add_params(url, params = {})
uri = URI(url)
params = Hash[URI.decode_www_form(uri.query || '')].merge(params)
uri.query = URI.encode_www_form(params)
uri.to_s
end
示例:
pry(main)> helper.add_params("http://example.com", b: 2)
=> "http://example.com?b=2"
pry(main)> helper.add_params("http://example.com?a=1", b: 2, c: 3)
=> "http://example.com?a=1&b=2&c=3"
pry(main)> helper.add_params("http://www.youtube.com/watch?v=og9B3BEnBHo", wmode: 'opaque')
=> "http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque"
答案 3 :(得分:2)
另一个选择是使用可寻址宝石
在项目中包含Addressable后,您所要做的就是:
url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = url.query_values.merge(wmode:"opaque")
答案 4 :(得分:0)
在URI模块的最新版本中,您只需执行以下操作即可:
original_uri = 'http://www.youtube.com/watch?v=og9B3BEnBHo'
append_params = { 'wmode': 'opaque' }
uri = URI.parse(original_uri)
params = URI.decode_www_form(uri.query || '') + append_params.to_a
uri.query = URI.encode_www_form(params)
puts uri.to_s