Ruby, Как добавить параметр к URL-адресу, который вы не знаете, если он уже имеет какой-либо другой параметр
Мне нужно добавить новый параметр к неопределенному URL, скажем param=value
.
В случае, если фактический URL уже имеет параметры, такие как
http://url.com?p1=v1&p2=v2
Я должен преобразовать URL-адрес в другой:
http://url.com?p1=v1&p2=v2¶m=value
Но если у URL-адреса еще нет такого параметра:
http://url.com
Я должен преобразовать URL-адрес в другой:
http://url.com?param=value
Я чувствую беспокойство, чтобы решить это с помощью Regex, потому что я не уверен, что поискать &
может быть достаточно. Я думаю, что, возможно, мне нужно преобразовать URL-адрес в объект URI, а затем добавить параметр и снова преобразовать его в String.
Ищите любые предложения от кого-то, кто уже был в этой ситуации.
Update
Чтобы помочь с участием, я делюсь базовым набором тестов:
require "minitest"
require "minitest/autorun"
def add_param(url, param_name, param_value)
# the code here
"not implemented"
end
class AddParamTest < Minitest::Test
def test_add_param
assert_equal("http://url.com?param=value", add_param("http://url.com", "param", "value"))
assert_equal("http://url.com?p1=v1&p2=v2¶m=value", add_param("http://url.com?p1=v1&p2=v2", "param", "value"))
assert_equal("http://url.com?param=value#&tro&lo&lo", add_param("http://url.com#&tro&lo&lo", "param", "value"))
assert_equal("http://url.com?p1=v1&p2=v2¶m=value#&tro&lo&lo", add_param("http://url.com?p1=v1&p2=v2#&tro&lo&lo", "param", "value"))
end
end
Ответы
Ответ 1
require 'uri'
uri = URI("http://url.com?p1=v1&p2=2")
ar = URI.decode_www_form(uri.query) << ["param","value"]
uri.query = URI.encode_www_form(ar)
p uri #=> #<URI::HTTP:0xa0c44c8 URL:http://url.com?p1=v1&p2=2¶m=value>
uri = URI("http://url.com")
uri.query = "param=value" if uri.query.nil?
p uri #=> #<URI::HTTP:0xa0eaee8 URL:http://url.com?param=value>
РЕДАКТИРОВАТЬ: (с помощью fguillen, чтобы объединить все хорошие предложения, а также сделать его совместимым с его тестовым набором вопросов.)
require 'uri'
def add_param(url, param_name, param_value)
uri = URI(url)
params = URI.decode_www_form(uri.query || "") << [param_name, param_value]
uri.query = URI.encode_www_form(params)
uri.to_s
end
Ответ 2
Более элегантное решение:
url = 'http://example.com?exiting=0'
params = {new_param: 1}
uri = URI.parse url
uri.query = URI.encode_www_form URI.decode_www_form(uri.query || '').concat(params.to_a)
uri.to_s #=> http://example.com?exiting=0&new_param=1