{"record":{"id":"4c1a36836fb91912","repo":"docusealco/docuseal","slug":"uuid","errorCode":null,"errorMessage":"#{uuid}","messagePattern":"#\\{uuid\\}","errorType":"validation","errorClass":"Submitters::SubmitValues::RequiredFieldError","httpStatus":422,"severity":"error","filePath":"lib/submitters/submit_values.rb","lineNumber":98,"sourceCode":"      submitter.values = merge_default_values(submitter)\n\n      required_field_uuids_acc = Set.new\n\n      submitter.values = maybe_remove_condition_values(submitter, required_field_uuids_acc:)\n\n      formula_values = build_formula_values(submitter)\n\n      if formula_values.present?\n        submitter.values = submitter.values.merge(formula_values)\n        submitter.values = maybe_remove_condition_values(submitter, required_field_uuids_acc:)\n      end\n\n      submitter.values = replace_current_date_placeholders(submitter)\n\n      required_field_uuids_acc.each do |uuid|\n        next if submitter.values[uuid].present?\n\n        raise RequiredFieldError, uuid if validate_required\n\n        Rollbar.warning(\"Required field #{submitter.id}: #{uuid}\") if defined?(Rollbar)\n      end\n\n      submitter\n    end\n\n    def maybe_set_signature_reason!(values, submitter, params)\n      return if params[:with_reason].blank?\n\n      reason_field_uuid = params[:with_reason]\n      signature_field_uuid = values.except(reason_field_uuid).keys.first\n\n      signature_field = submitter.submission.template_fields.find do |e|\n        e['uuid'] == signature_field_uuid && e['submitter_uuid'] == submitter.uuid\n      end\n\n      reason_field = submitter.submission.template_fields.find do |e|","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/docusealco/docuseal/blob/004a22c1c88109c7ba0b567df011a8cb13894001/lib/submitters/submit_values.rb#L80-L116","documentation":"Submitters::SubmitValues#assign_completed_attributes (lib/submitters/submit_values.rb:98) raises RequiredFieldError whose message is just the field uuid — it is raised when completing a submission (params[:completed] == 'true', validate_required: true) and a field the conditions logic marked required still has a blank value. The required set accumulates through maybe_remove_condition_values (and formula recomputation), so a field can become required by a condition branch rather than by its static 'required' flag.","triggerScenarios":"POST complete-form with an empty required text/date/signature value; a conditional branch whose rules make a hidden field required after values merge; formula values re-triggering a condition that re-adds the field to required_field_uuids_acc; signature reason fields added via with_reason not filled.","commonSituations":"Frontends skipping conditionally-shown fields the backend still deems required; template conditions edited after the signing UI loaded, changing the required set mid-flow; API submissions built from stale field lists missing newly required fields.","solutions":["Inspect the field uuid in the message against submission.template_fields to find its name and condition, then supply a value for it.","Recompute condition visibility server-side before completion: any field whose condition evaluates required must be present in submitter.values.","For partial saves use completed != 'true' (or validate_required: false on the internal call), which logs a Rollbar warning instead of raising.","After editing template conditions, refresh/reload the signing page so the client renders the newly required fields."],"exampleFix":"# before (completing while a conditionally-required field is blank)\nSubmitters::SubmitValues.update_submitter!(submitter,\n  { values: { name_uuid => 'John' }, completed: 'true' }, request)\n\n# after (fill the condition-required field too)\nSubmitters::SubmitValues.update_submitter!(submitter,\n  { values: { name_uuid => 'John', tax_id_uuid => '123-45' }, completed: 'true' }, request)","handlingStrategy":"validation","validationCode":"# Before completing, recompute which fields are required and assert values\nrequired_uuids = Submitters::SubmitValues # or replicate condition evaluation\n# simpler: check every statically-required field is filled\nmissing = submission.template_fields\n  .select { |f| f['submitter_uuid'] == submitter.uuid && f['required'] }\n  .reject { |f| submitter.values[f['uuid']].present? }\n  .map { |f| f['uuid'] }\nraise ArgumentError, \"missing required fields: #{missing.join(', ')}\" if missing.any? && completing","typeGuard":null,"tryCatchPattern":"begin\n  Submitters::SubmitValues.call(submitter, params, request)\nrescue Submitters::SubmitValues::RequiredFieldError => e\n  # e.message is the field uuid — resolve it for the user\n  field = submission.template_fields.find { |f| f['uuid'] == e.message }\n  render json: { error: \"Field '#{field && field['name']}' is required\" }, status: :unprocessable_entity\nend","preventionTips":["The raise message is only the field uuid — always resolve it against template_fields for display.","Conditions can make hidden fields required; re-evaluate condition logic server-side before completing.","Reload the signing page after template condition edits so newly required fields render.","Use completed != 'true' (partial save) when fields are intentionally still blank."],"tags":["docuseal","form-validation","required-fields","conditional-logic"],"backgroundTag":"required-field-missing","analyzedSha":"004a22c1c88109c7ba0b567df011a8cb13894001","analyzedAt":"2026-08-21T13:38:23.343Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}