This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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
|
||||
Reference in New Issue
Block a user