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?
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)
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.query
nil
.
<< ["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.
une Autre option est d'utiliser le adressable gem
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")
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"