faker-ruby/faker · error · ArgumentError

Invalid gender #{gender}. Must be one of male, female, or be

Error message

Invalid gender #{gender}. Must be one of male, female, or be omitted.

What it means

Raised by Faker::IdNumber.danish_id_number when the gender: keyword is anything other than :male, :female, or nil. Strings are converted with to_sym first, so 'male' and 'female' work, but every other value (e.g. :nonbinary, 'M', :Male) hits the else branch and raises ArgumentError. The gender argument only controls whether the last CPR digit is drawn from odd (male) or even (female) digits.

Source

Thrown at lib/faker/default/id_number.rb:260

      #   Faker::IdNumber.danish_id_number(formatted: true) #=> "050390-9980"
      #   Faker::IdNumber.danish_id_number(birthday: Date.new(1990, 3, 5)) #=> "0503909980"
      #   Faker::IdNumber.danish_id_number(gender: :female) #=> "0503909980"
      #
      # @faker.version next
      def danish_id_number(formatted: false, birthday: Faker::Date.birthday, gender: nil)
        valid_control_digits = danish_control_digits(birthday)
        control_digit = sample(valid_control_digits)
        digits = (0..9).to_a
        gender = gender.to_sym if gender.respond_to?(:to_sym)
        gender_digit = case gender
                       when nil
                         sample(digits)
                       when :male
                         sample(digits.select(&:odd?))
                       when :female
                         sample(digits.select(&:even?))
                       else
                         raise ArgumentError, "Invalid gender #{gender}. Must be one of male, female, or be omitted."
                       end

        [
          birthday.strftime('%d%m%y'),
          formatted ? '-' : '',
          control_digit,
          Faker::Number.number(digits: 2),
          gender_digit
        ].join
      end

      ##
      # Produces a random French social security number (INSEE number).
      #
      # @return [String]
      #
      # @example
      #   Faker::IdNumber.french_insee_number #=> "53290236-H"

View on GitHub (pinned to cca4184947)

Solutions

  1. Pass gender: :male, gender: :female, or gender: nil (lowercase symbol or lowercase string).
  2. If your domain model uses different gender values, map them before calling: { 'm' => :male, 'f' => :female, 'x' => nil }.fetch(user.gender)
  3. If you need a gender digit for a value outside male/female, call danish_id_number without gender and post-process, or generate the number yourself.

Example fix

# before
Faker::IdNumber.danish_id_number(gender: 'Male') # ArgumentError

# after
Faker::IdNumber.danish_id_number(gender: :male)
Faker::IdNumber.danish_id_number # omit gender entirely
Defensive patterns

Strategy: validation

Validate before calling

gender = nil if gender.blank?
gender = gender.to_s.downcase.to_sym unless gender.nil?
raise ArgumentError, 'unsupported gender' unless [nil, :male, :female].include?(gender)
Faker::IdNumber.danish_id_number(gender: gender)

Type guard

def valid_faker_gender?(value)
  [nil, :male, :female].include?(value.respond_to?(:to_sym) ? value.to_s.downcase.to_sym : nil)
end

Try / catch

begin
  Faker::IdNumber.danish_id_number(gender: gender)
rescue ArgumentError
  Faker::IdNumber.danish_id_number # retry without gender
end

Prevention

When it happens

Trigger: Faker::IdNumber.danish_id_number(gender: :male) or gender: 'female' are fine; danish_id_number(gender: :Male), gender: 'M', gender: :nonbinary, or any other value raises at lib/faker/default/id_number.rb:260 during the case statement on the symified gender.

Common situations: Test suites that model non-binary or abbreviated genders ('m'/'f') in user factories; passing a gender value straight from a form/enum whose values do not match male/female exactly; assuming the API accepts strings like 'Male' with a capital letter.

Related errors


AI-assisted analysis of faker-ruby/faker@cca4184947 (2026-08-21). Data as JSON: /api/errors/3548f948744640ee. Report an issue: GitHub.