def query_values=(new_query_values)
if new_query_values == nil
self.query = nil
return nil
end
if !new_query_values.is_a?(Array)
if !new_query_values.respond_to?(:to_hash)
raise TypeError,
"Can't convert #{new_query_values.class} into Hash."
end
new_query_values = new_query_values.to_hash
new_query_values = new_query_values.map do |key, value|
key = key.to_s if key.kind_of?(Symbol)
[key, value]
end
new_query_values.sort!
end
to_query = lambda do |parent, value|
if value.is_a?(Hash)
value = value.map do |key, val|
[
URI.encode_component(key, CharacterClasses::UNRESERVED),
val
]
end
value.sort!
buffer = ""
value.each do |key, val|
new_parent = "#{parent}[#{key}]"
buffer << "#{to_query.call(new_parent, val)}&"
end
return buffer.chop
elsif value.is_a?(Array)
buffer = ""
value.each_with_index do |val, i|
new_parent = "#{parent}[#{i}]"
buffer << "#{to_query.call(new_parent, val)}&"
end
return buffer.chop
elsif value == true
return parent
else
encoded_value = URI.encode_component(
value, CharacterClasses::UNRESERVED
)
return "#{parent}=#{encoded_value}"
end
end
buffer = ""
new_query_values.each do |parent, value|
encoded_parent = URI.encode_component(
parent, CharacterClasses::UNRESERVED
)
buffer << "#{to_query.call(encoded_parent, value)}&"
end
self.query = buffer.chop
end