{"record":{"id":"42705fe600a6f39d","repo":"jnunemaker/httparty","slug":"default-params-must-be-an-object-which-responds-to","errorCode":null,"errorMessage":"Default params must be an object which responds to #to_hash","messagePattern":"Default params must be an object which responds to #to_hash","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/httparty.rb","lineNumber":172,"sourceCode":"    #\n    # @example\n    #   class Foo\n    #     include HTTParty\n    #     disable_rails_query_string_format\n    #   end\n    def disable_rails_query_string_format\n      query_string_normalizer Request::NON_RAILS_QUERY_STRING_NORMALIZER\n    end\n\n    # Allows setting default parameters to be appended to each request.\n    # Great for api keys and such.\n    #\n    #   class Foo\n    #     include HTTParty\n    #     default_params api_key: 'secret', another: 'foo'\n    #   end\n    def default_params(h = {})\n      raise ArgumentError, 'Default params must be an object which responds to #to_hash' unless h.respond_to?(:to_hash)\n      default_options[:default_params] ||= {}\n      default_options[:default_params].merge!(h)\n    end\n\n    # Allows setting a default timeout for all HTTP calls\n    # Timeout is specified in seconds.\n    #\n    #   class Foo\n    #     include HTTParty\n    #     default_timeout 10\n    #   end\n    def default_timeout(value)\n      validate_timeout_argument(__method__, value)\n      default_options[:timeout] = value\n    end\n\n    # Allows setting a default open_timeout for all HTTP calls in seconds\n    #","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/jnunemaker/httparty/blob/8f4a09e343b94de9f934f388028ca97620c9b378/lib/httparty.rb#L154-L190","documentation":"The class-level DSL method `default_params` raises ArgumentError unless its argument responds to #to_hash. default_params is meant to merge a Hash of query parameters (like API keys) that HTTParty appends to every request; anything that is not Hash-like (or an object converted via to_hash) is rejected immediately at class-definition time rather than producing a broken query string later.","triggerScenarios":"Calling `default_params 'foo'`, `default_params nil`, `default_params [[:key, 'v']]`, or `default_params ENV['API_PARAMS']` (a String) inside a class that includes HTTParty. Also triggered by passing a JSON-encoded string instead of a parsed Hash.","commonSituations":"Loading params from YAML/ENV/JSON files that yield Strings or nil, porting code from libraries that accept arrays of pairs, and typos like `default_params :api_key => 'k'` where the hash is accidentally wrapped or omitted.","solutions":["Pass a plain Hash: `default_params api_key: 'secret'`.","Convert external input before the call: `default_params JSON.parse(raw)` or `default_params raw.to_h`.","Guard dynamic values: `default_params params if params.respond_to?(:to_hash)`."],"exampleFix":"# before\ndefault_params ENV['DEFAULT_PARAMS']        # String -> ArgumentError\n\n# after\nrequire 'json'\ndefault_params JSON.parse(ENV['DEFAULT_PARAMS'] || '{}')","handlingStrategy":"validation","validationCode":"raise ArgumentError, 'default_params must be a Hash' unless params.respond_to?(:to_hash)\ndefault_params params.to_hash","typeGuard":"hash_like = ->(v) { v.respond_to?(:to_hash) }","tryCatchPattern":"begin\n  default_params parsed\nrescue ArgumentError => e\n  raise ConfigError, \"bad default_params config: #{e.message}\"\nend","preventionTips":["Parse YAML/JSON config to Hash before any httparty DSL call.","Unit-test the config loader so it never emits Strings/nil into default_params.","Prefer keyword-style Hash literals at the call site."],"tags":["ruby","httparty","configuration","validation","argument-error","query-params"],"backgroundTag":"invalid-argument-type","analyzedSha":"8f4a09e343b94de9f934f388028ca97620c9b378","analyzedAt":"2026-08-21T19:30:42.003Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}