faker-ruby/faker · error · ArgumentError

text_color must be a hex value without '#'

Error message

text_color must be a hex value without '#'

What it means

Raised by Faker::Placeholdit.image when text_color is given and does not match the bare-hex shapes 'hhh' or 'hhhhhh'. Identical validation to background_color: a leading '#', 4/5-digit hex, or color names like 'black' are rejected; :random is replaced with a generated color before the guard runs.

Source

Thrown at lib/faker/default/placeholdit.rb:36

      # @example
      #     # Keyword arguments: size, format, background_color, text_color, text
      #   Faker::Placeholdit.image #=> "https://via.placeholder.com/300x300.png"
      #   Faker::Placeholdit.image(size: '50x50') #=> "https://via.placeholder.com/50x50.png"
      #   Faker::Placeholdit.image(size: '50x50', format: 'jpg') #=> "https://via.placeholder.com/50x50.jpg"
      #   Faker::Placeholdit.image(size: '50x50', format: 'gif', background_color: 'ffffff') #=> "https://via.placeholder.com/50x50.gif/ffffff"
      #   Faker::Placeholdit.image(size: '50x50', format: 'jpeg', background_color: :random) #=> "https://via.placeholder.com/50x50.jpeg/39eba7"
      #   Faker::Placeholdit.image(size: '50x50', format: 'jpeg', background_color: 'ffffff', text_color: '000') #=> "https://via.placeholder.com/50x50.jpeg/ffffff/000"
      #   Faker::Placeholdit.image(size: '50x50', format: 'jpg', background_color: 'ffffff', text_color: '000', text: 'Some Custom Text') #=> "https://via.placeholder.com/50x50.jpg/ffffff/000?text=Some Custom Text"
      #
      # @faker.version 1.6.0
      def image(size: '300x300', format: 'png', background_color: nil, text_color: nil, text: nil)
        background_color = generate_color if background_color == :random
        text_color = generate_color if text_color == :random

        raise ArgumentError, 'Size should be specified in format 300x300' unless size =~ /\A[0-9]+x[0-9]+\z$/
        raise ArgumentError, "Supported formats are #{SUPPORTED_FORMATS.join(', ')}" unless SUPPORTED_FORMATS.include?(format)
        raise ArgumentError, "background_color must be a hex value without '#'" unless background_color.nil? || background_color =~ /((?:^\h{3}$)|(?:^\h{6}$)){1}(?!.*\H)/
        raise ArgumentError, "text_color must be a hex value without '#'" unless text_color.nil? || text_color =~ /((?:^\h{3}$)|(?:^\h{6}$)){1}(?!.*\H)/

        image_url = "https://via.placeholder.com/#{size}.#{format}"
        image_url += "/#{background_color}" if background_color
        image_url += "/#{text_color}" if text_color
        image_url += "?text=#{text}" if text
        image_url
      end

      private

      def generate_color
        format('%06x', rand * 0xffffff)
      end
    end
  end
end

View on GitHub (pinned to cca4184947)

Solutions

  1. Pass 3- or 6-digit hex without '#': text_color: '000' or '000000'.
  2. Normalize design tokens: text_color: token.delete('#').
  3. Use text_color: :random when the exact tint does not matter.

Example fix

# before
Faker::Placeholdit.image(background_color: 'ffffff', text_color: '#000000') # ArgumentError

# after
Faker::Placeholdit.image(background_color: 'ffffff', text_color: '000000')
Defensive patterns

Strategy: validation

Validate before calling

text_color = text_color.to_s.delete('#').downcase
text_color = nil unless text_color.match?(/\A(?:\h{3}|\h{6})\z/)
Faker::Placeholdit.image(background_color: 'ffffff', text_color: text_color)

Type guard

def bare_hex_color?(value)
  value.is_a?(String) && value.match?(/\A(?:\h{3}|\h{6})\z/)
end

Try / catch

begin
  Faker::Placeholdit.image(text_color: fg)
rescue ArgumentError
  Faker::Placeholdit.image(text_color: :random)
end

Prevention

When it happens

Trigger: Faker::Placeholdit.image(text_color: '#000') (hash included), text_color: 'black', or text_color: '0000' raises 'text_color must be a hex value without \'#\''; text_color: '000' is accepted.

Common situations: Pairing the text color with a background color in a view helper and forgetting both must be hash-less; forwarding design-token colors that use '#rgb' notation; alpha-padded hex from design tools.

Related errors


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