{"record":{"id":"1c500207820119e5","repo":"ruby-grape/grape","slug":"unknown-validator-validator-type","errorCode":null,"errorMessage":"unknown validator: %{validator_type}","messagePattern":"unknown validator: %(.+?)","errorType":"exception","errorClass":"Grape::Exceptions::UnknownValidator","httpStatus":null,"severity":"error","filePath":"lib/grape/validations.rb","lineNumber":10,"sourceCode":"# frozen_string_literal: true\n\nmodule Grape\n  module Validations\n    extend Grape::Util::Registry\n\n    module_function\n\n    def require_validator(short_name)\n      raise Grape::Exceptions::UnknownValidator, short_name unless registry.key?(short_name)\n\n      registry[short_name]\n    end\n\n    def build_short_name(klass)\n      return if klass.name.blank?\n\n      klass.name.demodulize.underscore.delete_suffix('_validator')\n    end\n  end\nend\n","sourceCodeStart":1,"sourceCodeEnd":22,"githubUrl":"https://github.com/ruby-grape/grape/blob/22d7975629846a3c0c7bd2b34e140a7a1b4af8f6/lib/grape/validations.rb#L1-L22","documentation":"Every option in a `params` block that looks like a validator (allow_blank, values, regexp, default, length, same_as, except_values, and the *_of group validators) is resolved through Grape::Validations' registry by short name. When an option key matches no registered validator - a typo or an unregistered custom validator - Grape raises Grape::Exceptions::UnknownValidator while building the endpoint.","triggerScenarios":"`requires :email, presense: true` (typo for allow_blank/presence semantics). `optional :x, my_check: true` where MyCheckValidator was never registered. Using a validator from a gem or initializer that is not loaded in the current environment.","commonSituations":"Misspelled validation options. Custom validators defined in lib/ that load after the API class. Disabling an initializer in test/development that registers validators. Copying params from a project with extra registered validators.","solutions":["Fix the typo to a real validator option: allow_blank, values, regexp, default, length, same_as, etc.","Register custom validators: define a class ending in Validator (e.g. MyCheckValidator < Grape::Validations::Validators::Base) and call `Grape::Validations.register_validator(MyCheckValidator)` (Rails autoloaders may require eager_load in dev).","If the option is metadata for your own code, rename it so it does not collide with validator resolution."],"exampleFix":"# before\nrequires :email, type: String, presense: true # raises UnknownValidator: presense\n\n# after\nrequires :email, type: String, allow_blank: false\n\n# custom\nclass MyCheckValidator < Grape::Validations::Validators::Base\n  def validate_param!(attr, params)\n    @api.error!(\"#{attr} failed check\", 400) unless params[attr].match?(/ok/)\n  end\nend\nGrape::Validations.register_validator(MyCheckValidator)\nrequires :x, my_check: true","handlingStrategy":"validation","validationCode":"KNOWN_VALIDATORS = %w[allow_blank values regexp default length same_as except_values as\n                          at_least_one_of exactly_one_of all_or_none_of mutually_exclusive].freeze\n\nunknown = declared_opts.keys.map(&:to_s) - KNOWN_VALIDATORS - %w[type coerce]\nraise ArgumentError, \"unregistered validators: #{unknown.join(', ')}\" if unknown.any?","typeGuard":"def registered_validator?(name) = Grape::Validations.require_validator(name) && true rescue Grape::Exceptions::UnknownValidator\n  false\nend","tryCatchPattern":"begin\n  Grape::Validations.require_validator(:my_check)\nrescue Grape::Exceptions::UnknownValidator\n  Grape::Validations.register_validator(MyCheckValidator) # lazy registration before params load\nend","preventionTips":["Check option spelling against the validators list (allow_blank, values, regexp, default, length, same_as...).","Register custom validators in an initializer that loads before API classes; with Rails autoloading use `Rails.application.config.to_prepare`.","Boot specs per endpoint surface UnknownValidator at CI time."],"tags":["grape","validators","params","registry","typo"],"backgroundTag":"unknown-validation-keyword","analyzedSha":"22d7975629846a3c0c7bd2b34e140a7a1b4af8f6","analyzedAt":"2026-08-21T17:03:54.627Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}