将参数添加到url

man*_*els 35 ruby parameters url

我有一个网址(例如http://www.youtube.com/watch?v=og9B3BEnBHo),我想添加一个参数(wmode = opaque),以便它:

http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque

任何人都可以告诉我使用哪个功能来完成这项工作?

ste*_*lag 61

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
Run Code Online (Sandbox Code Playgroud)

(调用以String确保在原始URI没有查询字符串的情况下这也适用)

  • 这个答案已经过时了.请改用`URI.encode_www_form({wmode:"opaque"})`. (6认同)
  • 如果URL没有任何参数并且`URI.decode_www_form(nil)`中断,则`uri.query`返回`nil`. (3认同)
  • 注意; decode需要一个字符串而不是一个数组,所以`new_query_ar = URI.decode_www_form(uri.query ||'')<< ["wmode","opaque"]` (3认同)

Nic*_* Q. 17

随着Ruby多年来的发展,版本之间的答案也不尽相同.

1.9.2之后

Ruby 1.9.2看到decode_www_formencode_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
Run Code Online (Sandbox Code Playgroud)

说明

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 将嵌套数组新查询参数编码为字符串.

在1.9.2之前

require 'uri'

uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&') 
puts uri.to_s
Run Code Online (Sandbox Code Playgroud)

说明

[uri.query, "wmode=opaque"]是所有最终查询参数的数组.您可以通过扩展数组来添加更多:[uri.query, "wmode=opaque", "fullscreen=1"]或者通过添加到最终元素:"wmode=opaque&fullscreen=1"

compactnil从数组中删除元素,因此uri.query如果没有现有的查询参数,它将删除.

join最后,将它们连接成一个查询字符串.


KNe*_*jad 8

另一种选择是使用Addressable gem

https://github.com/sporkmonger/addressable

一旦你在你的项目中包含 Addressable,你所要做的就是:

url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = (url.query_values || {}).merge(wmode:"opaque")
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ick 5

由于您可能要添加多个查询参数,而不仅仅是一个,因此,此版本可让您通过简单地传递一个散列来附加所需数量的参数。此外,散列似乎是一种更自然的传递方式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
Run Code Online (Sandbox Code Playgroud)

例子:

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"
Run Code Online (Sandbox Code Playgroud)