{"record":{"id":"d54c2e43c79b8988","repo":"instructure/canvas-lms","slug":"assessor-and-assessee-required","errorCode":null,"errorMessage":"assessor and assessee required","messagePattern":"assessor and assessee required","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"app/models/rubric_association.rb","lineNumber":197,"sourceCode":"\n  def context_name\n    @cached_context_name ||= shard.activate do\n      Rails.cache.fetch([\"short_name_lookup\", context_code].cache_key) do\n        context.short_name\n      end\n    end\n  end\n\n  def update_values\n    self.bookmarked = true if purpose == \"bookmark\" || bookmarked.nil?\n    self.context_code ||= context_type && \"#{context_type.underscore}_#{context_id}\"\n    self.title ||= association_object.try(:title) || association_object.try(:name)\n    self.workflow_state ||= \"active\"\n  end\n  protected :update_values\n\n  def user_can_assess_for?(assessor: nil, assessee: nil, assessment_type: nil)\n    raise \"assessor and assessee required\" unless assessor && assessee\n\n    context.grants_right?(assessor, :manage_grades) ||\n      assessment_requests.incomplete.for_assessee(assessee).pluck(:assessor_id).include?(assessor.id) ||\n      user_can_self_assess_for?(assessor:, assessee:, assessment_type:)\n  end\n\n  def user_can_self_assess_for?(assessor: nil, assessee: nil, assessment_type: nil)\n    assessment_type == \"self_assessment\" &&\n      assignment&.rubric_self_assessment_enabled? &&\n      assessor == assessee &&\n      rubric_assessments.where(assessment_type: \"self_assessment\", user_id: assessor).empty?\n  end\n\n  def user_did_assess_for?(assessor: nil, assessee: nil)\n    raise \"assessor and assessee required\" unless assessor && assessee\n\n    assessment_requests.complete.for_assessee(assessee).for_assessor(assessor).any?\n  end","sourceCodeStart":179,"sourceCodeEnd":215,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/models/rubric_association.rb#L179-L215","documentation":"RubricAssociation#user_can_assess_for? decides whether a user may submit a rubric assessment for another user. Both assessor and assessee are required keyword args because the permission logic compares them against assessment requests and manage_grades rights. Canvas raises this RuntimeError when either is nil.","triggerScenarios":"Calling user_can_assess_for? with assessor: nil or assessee: nil, typically when the current user or the assessed student cannot be resolved (deleted user, unsaved submission, missing association).","commonSituations":"Controllers computing rubric permissions for peer reviews where the assessee submission has no user; rubric assessment code paths invoked for anonymous/group submissions; scripts iterating assessments with missing assessor records.","solutions":["Resolve both users before the check: pass assessor: current_user, assessee: submission.user","Skip the permission check (or return false) when either user is missing","Guard call sites: only invoke when assessor&.id && assessee&.id"],"exampleFix":"// before\nassoc.user_can_assess_for?(assessor: teacher, assessee: submission&.user)\n// after\nif teacher && submission.user\n  assoc.user_can_assess_for?(assessor: teacher, assessee: submission.user)\nelse\n  false\nend","handlingStrategy":"validation","validationCode":"return false if assessor.nil? || assessee.nil?","typeGuard":"def assessable_users?(a, s) = a.is_a?(User) && s.is_a?(User)","tryCatchPattern":"begin\n  can = assoc.user_can_assess_for?(assessor:, assessee:)\nrescue RuntimeError => e\n  raise unless e.message.include?(\"assessor and assessee\")\n  can = false\nend","preventionTips":["Resolve User records before permission checks","Return false early when either user is missing","Audit peer-review flows for anonymous/deleted-user cases"],"tags":["ruby","rails","rubrics","missing-argument"],"backgroundTag":"missing-required-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"}