{"record":{"id":"91918e614d3e6f52","repo":"instructure/canvas-lms","slug":"searchtermtooshorterror-raised-with-min-length-as-message","errorCode":null,"errorMessage":"SearchTermTooShortError (raised with min_length as message argument)","messagePattern":"SearchTermTooShortError \\(raised with min_length as message argument\\)","errorType":"validation","errorClass":"SearchTermTooShortError","httpStatus":null,"severity":"warning","filePath":"lib/search_term_helper.rb","lineNumber":125,"sourceCode":"    def error_json\n      {\n        \"errors\" => [{\n          \"field\" => \"search_term\",\n          \"code\" => \"invalid\",\n          \"message\" => \"#{@min_length} or more characters is required\"\n        }]\n      }\n    end\n  end\n\n  def self.valid_search_term?(search_term, min_length: MIN_SEARCH_TERM_LENGTH)\n    search_term.is_a?(String) && search_term.length >= min_length\n  end\n\n  def self.validate_search_term(search_term, min_length: MIN_SEARCH_TERM_LENGTH)\n    return if valid_search_term?(search_term, min_length:)\n\n    raise SearchTermTooShortError, min_length\n  end\n\n  def matches_attribute?(attr, search_term)\n    self[attr].to_s.downcase.include?(search_term.downcase)\n  end\nend\n","sourceCodeStart":107,"sourceCodeEnd":132,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/search_term_helper.rb#L107-L132","documentation":"SearchTermHelper#validate_search_term raises SearchTermTooShortError when the given search term is a String shorter than MIN_SEARCH_TERM_LENGTH (the min_length argument is passed as the exception message). This guards the database against expensive prefix scans on very short queries.","triggerScenarios":"Calling any API that validates via validate_search_term (user/course/communication channel search) with a query string of length < min_length (default constant), e.g. searching users with 'a'.","commonSituations":"Autocomplete UIs firing while a user types the first character; integrations forwarding empty or 1-2 char filters; tests hitting search endpoints with stub queries; version updates raising the minimum length constant.","solutions":["Lengthen the search term to at least min_length characters before calling the search API.","Short-circuit in the caller: if term.length < min_length, return an empty result without hitting the API.","Rescue SearchTermTooShortError and treat it as a no-results response in UI code.","Check the current MIN_SEARCH_TERM_LENGTH constant, as it may have changed across versions."],"exampleFix":"// before\nUser.search_by_attribute('a') // raises SearchTermTooShortError\n// after\nterm = 'a'\nresults = term.length >= 3 ? User.search_by_attribute(term) : []","handlingStrategy":"validation","validationCode":"min = SearchTermHelper::MIN_SEARCH_TERM_LENGTH\nraise ArgumentError, \"search term too short (min #{min})\" if term.to_s.length < min\n# or guard silently:\nresults = term.to_s.length >= min ? do_search(term) : []","typeGuard":"const isUsableSearchTerm = (t) => typeof t === 'string' && t.trim().length >= 3;","tryCatchPattern":"begin\n  SearchTermHelper.validate_search_term(term)\n  results = do_search(term)\nrescue SearchTermTooShortError\n  results = []\nend","preventionTips":["Debounce autocomplete UIs and only query at >= min term length.","Return an empty result set instead of calling search APIs for short filters.","Pin/read MIN_SEARCH_TERM_LENGTH after version upgrades since it may change."],"tags":["search","validation","input-length"],"backgroundTag":"invalid-query-parameter","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}