lib/fanforce/base/utils.rb in fanforce-base-1.2.3 vs lib/fanforce/base/utils.rb in fanforce-base-1.3.0

- old
+ new

@@ -76,20 +76,32 @@ elsif url =~ /^(.+)#.*\s+.+$/ extract_uri($1) end end - def to_query_string(obj, namespace=nil) - return '' if is_blank?(obj) - if obj.is_a?(Array) - obj.collect { |value| to_query_string(value, "#{namespace}[]") }.join '&' - elsif obj.is_a?(Hash) - obj.collect { |key, value| to_query_string(value, namespace ? "#{namespace}[#{key}]" : key) }.sort * '&' - elsif obj.is_a?(Object) - "#{CGI.escape(Fanforce::Base::InternalUtils.to_param(namespace))}=#{CGI.escape(Fanforce::Base::InternalUtils.to_param(obj).to_s)}" - else - raise "Argument must be an object, hash, or array; instead it was a #{obj.class}" + # Lifted from Rack::Utils.build_nested_query + # + def build_nested_query(value, prefix = nil) + case value + when Array + value.map { |v| + build_nested_query(v, "#{prefix}[]") + }.join("&") + when Hash + value.map { |k, v| + build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k)) + }.reject(&:empty?).join('&') + when nil + prefix + else + raise ArgumentError, "value must be a Hash" if prefix.nil? + "#{prefix}=#{escape(value)}" end + end + alias_method :to_query_string, :build_nested_query + + def escape(s) + CGI.escape(Fanforce::Base::InternalUtils.to_param(s)) end def curl_command(method, url, req_params) case method.to_s.downcase.to_sym when :get