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
- Pass gender: :male, gender: :female, or gender: nil (lowercase symbol or lowercase string).
- If your domain model uses different gender values, map them before calling: { 'm' => :male, 'f' => :female, 'x' => nil }.fetch(user.gender)
- 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
- Centralize gender mapping from your domain enum to :male/:female/nil in one helper.
- Never forward raw user input as gender; whitelist it first.
- Favor omitting gender when the value is optional in your model.
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
- Invalid birthday: #{birthday}. Danish CPR numbers are only d
- Search terms must be specified for grayscale images
- Search terms must be specified for pixelated images
- Search terms must be specified for colorized images
- Supported colorizations are #{SUPPORTED_COLORIZATIONS.join('
AI-assisted analysis of faker-ruby/faker@cca4184947 (2026-08-21).
Data as JSON: /api/errors/3548f948744640ee.
Report an issue: GitHub.