Ajouter un paramètre à l'url

j'ai une url (par exemple:http://www.youtube.com/watch?v=og9B3BEnBHo) et je voudrais ajouter un paramètre (paramètre wmode=opaque), de sorte que sa:

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

quelqu'un Peut-il me dire de quelle fonction utiliser pour faire ce travail?

26
demandé sur manuels 2011-10-16 20:52:16

4 réponses

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 assure que cela fonctionne aussi dans le cas où L'URI original n'a pas de chaîne de requête)

53
répondu steenslag 2016-11-29 12:35:11

comme Ruby a évolué au fil des ans, la réponse diffère d'une version à l'autre.

Après 1.9.2

Ruby 1.9.2 vu decode_www_form et encode_www_form ajouté au module URI, rendant les paramètres d'encodage plus faciles.

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 casse une chaîne de paramètres de requête (uri.query) dans un tableau imbriqué de paramètres ([["v", "og9B3BEnBHo"]])

uri.query || '' fournit soit la chaîne de requête de l'uri, soit si elle ne existe, une chaîne vide. Cela empêche decode_www_form à partir de l'exécution dans une erreur si uri.querynil.

<< ["wmode", "opaque"] ajoute un autre élément au tableau des paramètres de requête. Vous pouvez ajouter plus de en étendant new_query_ar:new_query_ar << ["fullscreen", "1"]

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

Avant 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 éventuels requête paramètre. Vous pouvez ajouter plus en étendant le tableau:[uri.query, "wmode=opaque", "fullscreen=1"] ou en ajoutant à l'élément final:"wmode=opaque&fullscreen=1"

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

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

16
répondu Nick Q. 2014-11-11 14:40:44

une Autre option est d'utiliser le adressable gem

https://github.com/sporkmonger/addressable

Une fois que vous aurez inclus adressable dans votre projet, vous n'aurez plus qu'à:

url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = url.query_values.merge(wmode:"opaque")
1
répondu KNejad 2018-05-03 12:08:48

puisque vous pouvez avoir plusieurs paramètres de requête que vous voulez ajouter et pas seulement un, voici une version qui vous permet d'ajouter autant de paramètres que vous voulez en passant simplement dans un hachage ... Plus un hachage semble être une façon plus naturelle de passer dans params de toute façon, même si vous ajoutez seulement un param.

  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"
0
répondu Tyler Rick 2018-08-09 22:06:29