64 lines
1.5 KiB
Ruby
64 lines
1.5 KiB
Ruby
require 'uri'
|
||
|
||
module URI
|
||
|
||
# Allows for taking a hash and turning it into URI/CGI params
|
||
# Since 1.8.x does not have ordered hashes the params might not
|
||
# be ordered.
|
||
#
|
||
# @todo URI.parameters needs URI escaping.
|
||
#
|
||
# @author Matt Kirk
|
||
|
||
def self.parameters(hash)
|
||
hash.map do |k,v|
|
||
if v.respond_to?(:join)
|
||
"#{k}=#{v.join(",")}"
|
||
else
|
||
"#{k}=#{v}"
|
||
end
|
||
end.join("&")
|
||
end
|
||
|
||
# We cannot send nested hash as a param in HTTP requests. For example,
|
||
# when we would like to send something like this:
|
||
#
|
||
# {:key => "value", :nested => {:nest => "value"}}
|
||
#
|
||
# It would be (or should be) mapped like this:
|
||
#
|
||
# /url/?key=value&nested=%7B%3Anest%3D%3E%5C%22value%5C%22%7D
|
||
#
|
||
# Doesn’t look to good ;) However there is a simple way to convert a nested
|
||
# hash into a params acceptable form. We can convert it to a form, that can
|
||
# be mapped into params like this:
|
||
#
|
||
# /url/?key=value&nested[nest]=value
|
||
#
|
||
# Here is method to convert any nested hash to a “one level” equivalent:
|
||
#
|
||
# @author Maciej Mensfeld
|
||
|
||
def self.nested_parameters(value, key=nil, hash={})
|
||
case value
|
||
when Hash
|
||
value.each do |k,v|
|
||
akey = key.nil? ? :"#{k}" : :"#{key}[#{k}]"
|
||
nested_parameters(v, akey, hash)
|
||
end
|
||
out_hash
|
||
when Array
|
||
value.each do |v|
|
||
nested_parameters(v, "#{key}[]", hash)
|
||
end
|
||
hash
|
||
when nil then ''
|
||
else
|
||
hash[key] = value
|
||
hash
|
||
end
|
||
parameters(hash)
|
||
end
|
||
|
||
end
|