{"record":{"id":"f173133d19056e26","repo":"Shopify/liquid","slug":"invalid-integer-f17313","errorCode":null,"errorMessage":"invalid integer","messagePattern":"invalid integer","errorType":"exception","errorClass":"Liquid::ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/liquid/utils.rb","lineNumber":47,"sourceCode":"        end\n\n        if from <= index\n          segments << item\n        end\n\n        index += 1\n      end\n\n      segments\n    end\n\n    def self.to_integer(num)\n      return num if num.is_a?(Integer)\n      num = num.to_s\n      begin\n        Integer(num)\n      rescue ::ArgumentError\n        raise Liquid::ArgumentError, \"invalid integer\"\n      end\n    end\n\n    def self.to_number(obj)\n      case obj\n      when Float\n        BigDecimal(obj.to_s)\n      when Numeric\n        obj\n      when String\n        DECIMAL_REGEX.match?(obj.strip) ? BigDecimal(obj) : obj.to_i\n      else\n        if obj.respond_to?(:to_number)\n          obj.to_number\n        else\n          0\n        end\n      end","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/Shopify/liquid/blob/807d45a6b3d4568e64e86b375e3702df2c7c860c/lib/liquid/utils.rb#L29-L65","documentation":"Utils.to_integer converts a value to an Integer; non-Integers are stringified and passed to Integer(), and if that fails (::ArgumentError) it raises Liquid::ArgumentError, 'invalid integer'. Used by tags/filters that require integral operands (e.g. loop limits, slice offsets).","triggerScenarios":"Passing a non-numeric string like 'abc', nil.to_s (''), '12abc', or a Float in a position where Utils.to_integer is called (e.g. slice/pagination parameters in tags).","commonSituations":"Template variables bound to user input that is not numeric; empty strings from unassigned variables; locale-formatted numbers ('1,000') that Integer() cannot parse.","solutions":["Ensure the value is an Integer or a numeric string before passing it to tags/filters that need integers.","Sanitize in the template with the default or plus filters, e.g. {{ limit | default: 10 | plus: 0 }}.","Validate/cast user-supplied values in Ruby before adding them to assigns."],"exampleFix":"// before\nrender(assigns.merge('limit' => params[:limit]))\n// after\nrender(assigns.merge('limit' => Integer(params[:limit], 10) rescue 10))","handlingStrategy":"validation","validationCode":"def ensure_integer(v)\n  raise Liquid::ArgumentError, 'invalid integer' unless v.is_a?(Integer) || v.to_s.match?(/\\A-?\\d+\\z/)\n  v\nend","typeGuard":"def integer_like?(v)\n  v.is_a?(Integer) || (v.respond_to?(:to_s) && v.to_s.match?(/\\A-?\\d+\\z/))\nend","tryCatchPattern":"begin\n  output = template.render(assigns)\nrescue Liquid::ArgumentError => e\n  raise unless e.message == 'invalid integer'\n  assigns['limit'] = assigns['limit'].to_i.nonzero? || 10\n  retry\nend","preventionTips":["Cast user input to Integer in Ruby before adding to assigns","Use Liquid's default/plus filters as template-side guards","Reject locale-formatted numbers in numeric template parameters"],"tags":["liquid","type-error","argument-error","integer-coercion"],"backgroundTag":"invalid-argument-value","analyzedSha":"807d45a6b3d4568e64e86b375e3702df2c7c860c","analyzedAt":"2026-09-08T11:31:38.917Z","contentChangedAt":"2026-09-08T11:31:38.917Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}