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

Ruby, Как добавить параметр к URL-адресу, который вы не знаете, если он уже имеет какой-либо другой параметр

Мне нужно добавить новый параметр к неопределенному URL, скажем param=value.

В случае, если фактический URL уже имеет параметры, такие как

http://url.com?p1=v1&p2=v2

Я должен преобразовать URL-адрес в другой:

http://url.com?p1=v1&p2=v2&param=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&param=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&param=value#&tro&lo&lo", add_param("http://url.com?p1=v1&p2=v2#&tro&lo&lo", "param", "value"))
  end
end
4b9b3361

Ответ 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&param=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