Добавить параметр в url
У меня есть url (например http://www.youtube.com/watch?v=og9B3BEnBHo), и я хотел бы добавить к нему параметр (wmode = opaque), чтобы его:
http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque
Может ли кто-нибудь сказать мне, какую функцию использовать, чтобы сделать эту работу?
Ответы
Ответ 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
, наконец, присоединяет их к строке запроса.