Точно напротив метода Руби CGI.parse? - PullRequest
10 голосов
/ 09 марта 2011

Я бы хотел провести некоторую очистку параметров запроса.

Я анализирую запрос с помощью CGI.parse, затем удаляю некоторые параметры, но не могу найти противоположный метод для построения запроса.

Я действительно не хочу делать что-то вроде

params.map{|n,v| "#{CGI.escape n}=#{CGI.escape v.to_s}"}.join("&")

Должен быть более простой способ. Есть ли?

Ответы [ 4 ]

6 голосов
/ 25 июля 2013

В модуле URI есть хороший метод:

require 'uri'
URI.encode_www_form("q" => "ruby", "lang" => "en")  #=> "q=ruby&lang=en"
3 голосов
/ 10 марта 2011

Если вы используете Rails (или не возражаете против использования ActiveSupport), вы можете использовать to_param (AKA to_query) :

{ :a => '&', :b => 'Where is pancake house?', :c => ['an', 'array'] }.to_param
# a=%26&b=Where+is+pancake+house%3F&c%5B%5D=an&c%5B%5D=array

to_param обрабатывает массивы немного по-другому, чем ваша версия, хотя он выдаст c[]=an&c[]=array, а не просто c=an&c=array.

2 голосов
/ 09 марта 2011

Хотя лучшего ответа нет, я приведу метод, которым я сейчас пользуюсь.

def build_query(params)
  params.map do |name,values|
    values.map do |value|
      "#{CGI.escape name}=#{CGI.escape value}"
    end
  end.flatten.join("&")
end
0 голосов
/ 10 марта 2011

Я не уверен, является ли следующее упрощением, но это позволяет избежать расширения пар (ключ, значение) хэша.

params.map{|qq| qq.map{|q| CGI.escape(q)}.join('=')}.join('&')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...