Добавить параметр в URL - PullRequest
       3

Добавить параметр в URL

33 голосов
/ 16 октября 2011

У меня есть URL-адрес (например, http://www.youtube.com/watch?v=og9B3BEnBHo), и я хотел бы добавить в него параметр (wmode = opaque), чтобы его:

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

Может кто-нибудь сказать мне, какую функцию использовать, чтобы сделать эту работу?

Ответы [ 4 ]

58 голосов
/ 16 октября 2011
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

(вызов String гарантирует, что это также работает в случае, когда исходный URI не имеет строки запроса)

17 голосов
/ 11 ноября 2014

По мере того, как Ruby развивался годами, ответ различается в разных версиях.

После 1.9.2

Ruby 1.9.2 увидел decode_www_form и encode_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

Пояснение

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

Пояснение

[uri.query, "wmode=opaque"] - это массив всех возможных параметров запроса.Вы можете добавить больше, расширив массив: [uri.query, "wmode=opaque", "fullscreen=1"] или добавив к последнему элементу: "wmode=opaque&fullscreen=1"

compact удаляет nil элементов из массива, таким образом, он удаляетuri.query если нет параметра запроса.

join, наконец, объединяет их в строку запроса.

3 голосов
/ 10 августа 2018

Поскольку у вас может быть несколько параметров запроса, которые вы хотите добавить, а не только один, вот версия, которая позволяет добавлять столько параметров, сколько вы хотите, просто передавая хеш-код ... Плюс хеш-код кажется более естественным способомв любом случае передать 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

Примеры:

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"
2 голосов
/ 03 мая 2018

Другой вариант - использовать адресный камень

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...