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?
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)
Comme Ruby a évolué au fil des ans, la réponse varie selon les versions.
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
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é.
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"]
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.
Une autre option consiste à utiliser la gemme 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")
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"