activerecord-hackery/ransack · error · ArgumentError

Invalid argument (# ) supplied to values=

Error message

Invalid argument (#{args.class}) supplied to values=

What it means

Nodes::Condition#values= (aliased v=) mirrors attributes=: it accepts only an Array of values or an indexed Hash ({'0' => {value: ...}, ...}). Passing a bare scalar (String, Integer, nil-set scalars outside the accepted shapes) raises this ArgumentError. Normal form params arrive as indexed hashes, so this almost always comes from programmatic condition building.

Solutions

  1. Wrap the value in an array: condition.v = ['Alice']
  2. Or use the indexed hash form: condition.values = { '0' => { value: 'Alice' } }
  3. Better, let Search#build create the condition wholesale: Person.ransack(name_eq: 'Alice')

Example fix

# before
condition.values = 'Alice'
# => ArgumentError: Invalid argument (String) supplied to values=

# after
condition.values = ['Alice']
Defensive patterns

Strategy: validation

Validate before calling

vals = Array(vals) unless vals.is_a?(Hash)
condition.values = vals

Type guard

def valid_values_arg?(arg)
  arg.is_a?(Array) || arg.is_a?(Hash)
end

Prevention

When it happens

Trigger: condition.values = 'Alice' (String); condition.v = 42; building a condition manually with v: 'Alice' instead of v: ['Alice']; merging JSON payloads where the value index level is lost.

Common situations: Service objects/specs constructing Ransack nodes by hand; converting JSON search payloads to Ransack params and dropping the nested {index: {value: ...}} layer; copying examples that predate the current node API.

Related errors


AI-assisted analysis of activerecord-hackery/ransack@e82f6bab39 (2026-08-21). Data as JSON: /api/errors/05d336e73e339291. Report an issue: GitHub.

Appendix: source

Thrown at lib/ransack/nodes/condition.rb:116

      def values
        @values ||= []
      end
      alias :v :values

      def values=(args)
        case args
        when Array
          args.each do |val|
            val = Value.new(@context, val)
            self.values << val
          end
        when Hash
          args.each do |index, attrs|
            val = Value.new(@context, attrs[:value])
            self.values << val
          end
        else
          raise ArgumentError,
            "Invalid argument (#{args.class}) supplied to values="
        end
      end
      alias :v= :values=

      def combinator
        @attributes.size > 1 ? @combinator : nil
      end

      def combinator=(val)
        @combinator = Constants::AND_OR.detect { |v| v == val.to_s } || nil
      end
      alias :m= :combinator=
      alias :m :combinator

      # == build_attribute
      #
      #  This method was originally called from Nodes::Grouping#new_condition

View on GitHub (pinned to e82f6bab39)