2012-02-09 1 views
4

Я ищу удобный и функциональный способ добавления закодированных значений в строку запроса URL-адреса в Ruby. В настоящее время у меня есть:Как добавить значения кодированного запроса в URL?

require 'open-uri' 

u = URI::HTTP.new("http", nil, "mydomain.example", nil, nil, "/tv", nil, "show=" + URI::encode("Rosie & Jim"), nil) 

p u.to_s # => "http://mydomain.example/tv?show=Rosie%20&%20Jim" 

Это не то, что я ищу, потому что мне нужно, чтобы получить "http://mydomain.example/tv?show=Rosie%20%26%20Jim", так что значение show= не обрезается.

Есть ли Open :: URI есть другой метод, который бы сделал это? Если нет, можно ли это сделать с любым другим стандартным Ruby или gem?

+0

Вы можете захотеть взглянуть на [Адресный] (http://addressable.rubyforge.org/api/) камень. Это все URI Ruby's, и многое другое. Очень рекомендуется для чего-либо, кроме простой обработки URL-адресов. –

ответ

9

Попробуйте с CGI::escape вместо URI::encode. doc here

+0

Спасибо. Это делает работу. Я заметил, что пробелы показывают как плюсы; поэтому, когда я это просмотрел, я обнаружил, что кодировка в URL-запросах называется «www_form»; это заставило меня найти более удобный способ сделать это с помощью open-uri, но я принимаю ваш ответ, потому что он делает именно то, что я просил. – SimonMayer

7

URI.encode_www_form работает хорошо и является более удобным для добавления нескольких аргументов

q = URI.encode_www_form("show" => "Rosie & Jim", "series" => "3", "episode" => "4") 
u = URI::HTTP.new("http", nil, "mydomain.example", nil, nil, "/tv/ragdoll", nil, q, nil)