Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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 не имеет строки запроса)

Ответ 2

Поскольку 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, наконец, присоединяет их к строке запроса.