{"record":{"id":"2ff16b1001450bf3","repo":"instructure/canvas-lms","slug":"setting-name-cannot-be-nil","errorCode":null,"errorMessage":"setting_name cannot be nil","messagePattern":"setting_name cannot be nil","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/canvas_operations/base_concerns/settings.rb","lineNumber":82,"sourceCode":"      def setting_for(name, default:, cluster:)\n        Canvas::Reloader.reload\n\n        settings_key = settings_key(name, cluster:)\n        value = Setting.get(settings_key, default)\n        log_message(\"Fetched setting #{settings_key} with value `#{value.inspect}` before type casting\", level: :debug)\n\n        value\n      end\n\n      def modify_setting_for(name, value, cluster:)\n        was_success = Setting.set(settings_key(name, cluster:), value)\n        log_message(\"Modified setting #{settings_key(name, cluster:)} to value `#{value.inspect}` successfully? #{was_success}\")\n\n        was_success\n      end\n\n      def setting(setting_name, default:, type_cast: :to_s)\n        raise ArgumentError, \"setting_name cannot be nil\" if setting_name.nil?\n        raise ArgumentError, \"setting_name must be a symbol or string\" unless setting_name.is_a?(Symbol) || setting_name.is_a?(String)\n\n        validate_type_cast!(type_cast, setting_name)\n\n        # Method to get the Setting value and apply type casting\n        #\n        # If no cluster is provided, the current shard's cluster.\n        define_singleton_method(setting_name) do |cluster: nil|\n          cluster ||= Shard.current.database_server.id\n\n          raw_value = setting_for(setting_name, default:, cluster:)\n\n          case type_cast\n          when Symbol\n            raw_value.public_send(type_cast)\n          when Proc\n            type_cast.call(raw_value)\n          end","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/canvas_operations/base_concerns/settings.rb#L64-L100","documentation":"ArgumentError raised by the CanvasOperations::Settings#setting helper when the setting_name positional argument is nil. Setting names become part of the namespaced Setting key, so a nil name cannot be resolved.","triggerScenarios":"Calling setting(nil, default: ...) on an operation class extending the Settings concern, typically because a computed name variable is nil.","commonSituations":"Building the setting name dynamically (e.g. \"#{feature}_enabled\".to_sym) where the interpolated variable is nil; refactors that changed a constant into a method returning nil.","solutions":["Pass a non-nil Symbol or String as the first argument","Guard the call site and provide a default name when the dynamic value is missing","Fail fast upstream by validating the interpolated value before calling setting"],"exampleFix":"// before\nsetting(prefix && \"#{prefix}_timeout\".to_sym, default: 30)\n// after\nraise ArgumentError, 'prefix missing' unless prefix\nsetting(\"#{prefix}_timeout\".to_sym, default: 30)","handlingStrategy":"type-guard","validationCode":"raise 'setting name required' if name.nil?\nraise 'must be Symbol or String' unless name.is_a?(Symbol) || name.is_a?(String)","typeGuard":"def valid_setting_name?(name)\n  !name.nil? && (name.is_a?(Symbol) || name.is_a?(String))\nend","tryCatchPattern":"rescue ArgumentError => e\n  Rails.logger.error(\"Bad setting call: #{e.message}\")\nend","preventionTips":["Assert dynamic name parts are non-nil before interpolation","Keep setting names in constants","Add unit tests for operations built from config-driven names"],"tags":["ruby","arguments","null","canvas-operations"],"backgroundTag":"null-argument","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"}