Method: Addressable::URI#query_values=

Defined in:
lib/addressable/uri.rb

#query_values=(new_query_values) ⇒ Object

Sets the query component for this URI from a Hash object. An empty Hash or Array will result in an empty query string.

Examples:

uri.query_values = {:a => "a", :b => ["c", "d", "e"]}
uri.query
# => "a=a&b=c&b=d&b=e"
uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']]
uri.query
# => "a=a&b=c&b=d&b=e"
uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]]
uri.query
# => "a=a&b=c&b=d&b=e"
uri.query_values = [['flag'], ['key', 'value']]
uri.query
# => "flag&key=value"

Parameters:

  • new_query_values (Hash, #to_hash, Array)

    The new query values.



1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
# File 'lib/addressable/uri.rb', line 1723

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
    # Useful default for OAuth and caching.
    # Only to be used for non-Array inputs. Arrays should preserve order.
    new_query_values.sort!
  end

  # new_query_values have form [['key1', 'value1'], ['key2', 'value2']]
  buffer = "".dup
  new_query_values.each do |key, value|
    encoded_key = URI.encode_component(
      key, CharacterClassesRegexps::UNRESERVED
    )
    if value == nil
      buffer << "#{encoded_key}&"
    elsif value.kind_of?(Array)
      value.each do |sub_value|
        encoded_value = URI.encode_component(
          sub_value, CharacterClassesRegexps::UNRESERVED
        )
        buffer << "#{encoded_key}=#{encoded_value}&"
      end
    else
      encoded_value = URI.encode_component(
        value, CharacterClassesRegexps::UNRESERVED
      )
      buffer << "#{encoded_key}=#{encoded_value}&"
    end
  end
  self.query = buffer.chop
end