web-dev-qa-db-fra.com

Ajouter un paramètre à l'URL

J'ai une URL (par exemple http://www.youtube.com/watch?v=og9B3BEnBHo ) et j'aimerais y ajouter un paramètre (wmode = opaque) afin que:

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

Quelqu'un peut-il me dire quelle fonction utiliser pour faire ce travail?

31
manuels
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

(L'appel à String garantit que cela fonctionne également dans le cas où l'URI d'origine ne contient pas de chaîne de requête)

57
steenslag

Comme Ruby a évolué au fil des ans, la réponse varie selon les versions.

Après 1.9.2

Ruby 1.9.2 a vu decode_www_form et encode_www_form ajoutés au module URI, facilitant ainsi le codage des paramètres.

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

Explication

URI.decode_www_form divise une chaîne de paramètres de requête (uri.query) en un tableau imbriqué de paramètres ([["v", "og9B3BEnBHo"]])

uri.query || '' fournit la chaîne de requête de l'URI ou, si elle n'existe pas, une chaîne vide. Cela empêche decode_www_form de rencontrer une erreur si uri.query est nil.

<< ["wmode", "opaque"] ajoute un autre élément au tableau de paramètres de requête. Vous pouvez en ajouter d'autres en développant davantage new_query_ar: new_query_ar << ["fullscreen", "1"]

URI.encode_www_form code dans la chaîne les nouveaux paramètres de requête du tableau imbriqué.

Avant le 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

Explication

[uri.query, "wmode=opaque"] est un tableau de tous les paramètres de requête éventuels. Vous pouvez en ajouter d'autres en développant le tableau: [uri.query, "wmode=opaque", "fullscreen=1"] ou en ajoutant à l'élément final: "wmode=opaque&fullscreen=1"

compact supprime les éléments nil d'un tableau. Ainsi, il supprime uri.query s'il n'y a pas de paramètre de requête existant.

join , enfin, les joint dans une chaîne de requête.

17
Nick Q.

Une autre option consiste à utiliser la gemme Addressable 

https://github.com/sporkmonger/addressable

Une fois que vous avez inclus Addressable dans votre projet, il vous suffit de:

url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = url.query_values.merge(wmode:"opaque")
2
KNejad

Puisque vous souhaitez ajouter plusieurs paramètres de requête et non un seul, voici une version qui vous permet d’ajouter autant de paramètres que vous le souhaitez en passant simplement un hachage ... De plus, un hachage semble être un moyen plus naturel de passer en params de toute façon, même si vous n’ajoutez qu’un paramètre.

  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

Exemples:

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"
1
Tyler Rick