{"record":{"id":"83973676849e4678","repo":"CanCanCommunity/cancancan","slug":"accessible-by-strategy-must-be-one-of-valid-acce","errorCode":null,"errorMessage":"accessible_by_strategy must be one of #{valid_accessible_by_strategies.join(', ')}","messagePattern":"accessible_by_strategy must be one of #(.+?)","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/cancan/config.rb","lineNumber":94,"sourceCode":"\n  def self.with_accessible_by_strategy(value)\n    return yield if value == accessible_by_strategy\n\n    validate_accessible_by_strategy!(value)\n\n    begin\n      strategy_was = accessible_by_strategy\n      @accessible_by_strategy = value\n      yield\n    ensure\n      @accessible_by_strategy = strategy_was\n    end\n  end\n\n  def self.validate_accessible_by_strategy!(value)\n    return if valid_accessible_by_strategies.include?(value)\n\n    raise ArgumentError, \"accessible_by_strategy must be one of #{valid_accessible_by_strategies.join(', ')}\"\n  end\n\n  def self.does_not_support_subquery_strategy?\n    !defined?(CanCan::ModelAdapters::ActiveRecordAdapter) ||\n      CanCan::ModelAdapters::ActiveRecordAdapter.version_lower?('5.0.0')\n  end\nend\n","sourceCodeStart":76,"sourceCodeEnd":102,"githubUrl":"https://github.com/CanCanCommunity/cancancan/blob/8c1bf153a3da7b2261d6fa4a5f84eb28e2feb828/lib/cancan/config.rb#L76-L102","documentation":"CanCan.accessible_by_strategy= validates the value via validate_accessible_by_strategy! (lib/cancan/config.rb:94) against CanCan.valid_accessible_by_strategies, which is [:left_join] plus the subquery-family strategies (:joined_alias_exists_subquery, :joined_alias_each_rule_as_exists_subquery, :subquery) only when ActiveRecord >= 5 is available. Anything else, including valid-looking values on an old Rails, raises ArgumentError.","triggerScenarios":"Typo'd or wrong-type values: CanCan.accessible_by_strategy = :subquerry, 'subquery' (String), or :leftJoin; setting :subquery when ActiveRecord is < 5 so it is not in the valid list; passing an ad-hoc strategy to CanCan.with_accessible_by_strategy in a spec.","commonSituations":"Initializers drifted from a README snippet whose supported values differ across cancancan versions; environment divergence where development is on Rails 7 but a staging app pins Rails 4; string vs symbol mismatch when reading the value from ENV.","solutions":["Use a value from the allowed list: check it live with puts CanCan.valid_accessible_by_strategies.","On Rails < 5, use only :left_join.","Derive the value defensively: CanCan.accessible_by_strategy = (ENV['STRATEGY'] || :left_join).to_sym, after confirming membership in the valid list."],"exampleFix":"# before\nCanCan.accessible_by_strategy = ENV.fetch('CANCAN_STRATEGY', :left_join)  # 'subquerry' from ENV -> ArgumentError\n\n# after\nstrategy = ENV.fetch('CANCAN_STRATEGY', :left_join).to_sym\nCanCan.accessible_by_strategy = strategy if CanCan.valid_accessible_by_strategies.include?(strategy)","handlingStrategy":"validation","validationCode":"strategy = ENV.fetch('CANCAN_STRATEGY', :left_join).to_sym\nraise ArgumentError, \"invalid strategy #{strategy}; valid: #{CanCan.valid_accessible_by_strategies.join(', ')}\" unless CanCan.valid_accessible_by_strategies.include?(strategy)\nCanCan.accessible_by_strategy = strategy","typeGuard":"def valid_strategy?(value)\n  CanCan.valid_accessible_by_strategies.include?(value.to_s.to_sym)\nend","tryCatchPattern":"begin\n  CanCan.accessible_by_strategy = strategy\nrescue ArgumentError => e\n  raise ConfigError, e.message\nend","preventionTips":["Never source strategy values from unvalidated config; validate against the public allow-list first.","Use symbols, not strings, when assigning configuration in initializers.","Log CanCan.valid_accessible_by_strategies at boot so the supported set is visible per environment."],"tags":["configuration","argument-validation","cancancan","ruby"],"backgroundTag":"invalid-config-value","analyzedSha":"8c1bf153a3da7b2261d6fa4a5f84eb28e2feb828","analyzedAt":"2026-08-21T20:05:55.000Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}