Постепенное создание произвольных URL-адресов в Ruby on Rails

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть URL-адрес в строке. Какой самый краткий способ добавить к нему некоторые параметры?

например

 base = 'http://example.com'
uri1 = some_magical_method(base, :p1 => 'v1') # => http://example.com/?p1=v1
uri2 = some_magical_method(uri1, :p2 => 'v2') # => http://example.com/?p1=v1amp;p2=v2
uri3 = some_magical_method(uri2, :p3 => nil)  # => http://example.com/?p1=v1amp;p2=v2
  

1) В Ruby?

2) В Rails?

Ответ №1:

В Rails, где доступна ActiveSupport, самый простой способ — создать хэш, а затем вызвать #to_query его.

 >> params = {}
>> params[:foo] = "bar"
>> params[:baz] = "bang"
>> params.to_query
=> "baz=bangamp;foo=bar"
  

В обычном Ruby то же самое применимо, но вам нужно будет написать кодировщик самостоятельно:

 require 'cgi'
def to_query(hsh)
  hsh.map {|k, v| "#{k}=#{CGI::escape v}" }.join("amp;")
end

params = {}
params[:foo] = "bar"
params[:baz] = "bang"

to_query params
=> "baz=bangamp;foo=bar"
  

Комментарии:

1. Есть ли один вызов, который также позаботится об извлечении строки запроса из URL, затем выполнит то, что вы сказали, а затем вернет исходный URL с новой строкой запроса?

2. Лучше всего будет использовать URI::parse , чтобы разделить URL-адрес на составные части, затем вы можете повторно собрать его из интересующих вас частей.

3. Этот вопрос отвечает только на один аспект вопроса: генерация строки запроса. Как его добавить?

Ответ №2:

 require 'open-uri'

def params_to_query(params)
  params.map {|p, v| "#{p}=#{URI.escape(v.to_s)}"}.join('amp;')
end

def append_url(url, params = {})
  uri = URI.parse(url)
  uri.query = uri.query.nil? ? params_to_query(params) : [uri.query, params_to_query(params)].join('amp;') unless params.empty?
  uri.to_s
end

puts append_url('http://example.com', {:query => 'my_example'} # "http://example.com?query=my_example"
  

Комментарии:

1. Спасибо, но я должен был быть более ясным. Я хотел знать, что было возможно с использованием встроенных библиотек Ruby и Rails.

2. В Rails вам нужно только заменить params_to_query(params) на params.to_query . Другая логика такая же.