2013-03-02 2 views
1

Мне нужно преобразовать значения и ключи хеша в строку, чтобы правильно подготовить его в качестве параметров для Net::HTTP.post_form. Например:Преобразование ключей и значений хеша в строку

Мне нужно преобразовать

{:x => [1,2,3,4]} 

в

{"x"=>"[1, 2, 3, 4]"} 

Это важно для преобразования символов в строке и что массивы окружены кавычками.

  • to_json возвращает строку и не решает проблему; Мне нужен хэш в качестве возврата.
  • хэш может иметь больше ключей и значений, поэтому я не могу задать код to_s каждому ключу или значению.

Как это сделать?

+0

Используйте для этого класс URI Ruby. –

ответ

9

Что об этом

Hash[ { :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] } ] 
#=> {"x"=>"[1, 2, 3, 4]"} 

Или на Ruby,> = 2,1

{ :x => [1,2,3,4] }.map { |k, v| [k.to_s, v.to_s] }.to_h 
#=> {"x"=>"[1, 2, 3, 4]"} 
4

Не изобретайте хорошо изученное колесо. Вместо Руби URI является хорошим инструментом для использования:

require 'uri' 

uri = URI.parse('http://www.example.com') 
uri.query = URI.encode_www_form({:x => [1,2,3,4]}) 
uri.to_s # => "http://www.example.com?x=1&x=2&x=3&x=4" 

Если вы хотите только значения запроса:

query = URI.encode_www_form({:x => [1,2,3,4]}) # => "x=1&x=2&x=3&x=4" 

Это действительно звучит, как вы заново изобретать колеса, если вы собираетесь отправить, что через Net :: HTTP. Сериализация хеша до {"x"=>"[1, 2, 3, 4]"} ограничит ваш код работой только с вашим кодом. Использование JSON, YAML или XML упростит вашу жизнь, а ваш код станет более переносимым.

JSON позволяет легко перемещать хэш от машины к машине, между языками, как Ruby/Python/Java/Perl, является ли браузер на сервер или клиент-сервер:

require 'json' 
hash = {:x => [1,2,3,4]} 

hash.to_json 
=> "{\"x\":[1,2,3,4]}" 

JSON[hash.to_json] 
=> { 
    "x" => [ 
     [0] 1, 
     [1] 2, 
     [2] 3, 
     [3] 4 
    ] 
} 

Это обратный ход хэша, к представлению JSON, к хешу. Промежуточная строка "{\"x\":[1,2,3,4]}" легко отправляется через Net :: HTTP.

+0

Но это отличается от того, что мне нужно. Как вы можете видеть, этот метод устанавливает 'x' с несколькими значениями. Мне нужно, чтобы оно получило одно значение; строка '" [1,2,3,4] "'. Это другое. –

Смежные вопросы