docusealco/docuseal · error · Submitters::SubmitValues::RequiredFieldError
#{uuid}
Error message
#{uuid} What it means
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.
Source
Thrown at lib/submitters/submit_values.rb:98
submitter.values = merge_default_values(submitter)
required_field_uuids_acc = Set.new
submitter.values = maybe_remove_condition_values(submitter, required_field_uuids_acc:)
formula_values = build_formula_values(submitter)
if formula_values.present?
submitter.values = submitter.values.merge(formula_values)
submitter.values = maybe_remove_condition_values(submitter, required_field_uuids_acc:)
end
submitter.values = replace_current_date_placeholders(submitter)
required_field_uuids_acc.each do |uuid|
next if submitter.values[uuid].present?
raise RequiredFieldError, uuid if validate_required
Rollbar.warning("Required field #{submitter.id}: #{uuid}") if defined?(Rollbar)
end
submitter
end
def maybe_set_signature_reason!(values, submitter, params)
return if params[:with_reason].blank?
reason_field_uuid = params[:with_reason]
signature_field_uuid = values.except(reason_field_uuid).keys.first
signature_field = submitter.submission.template_fields.find do |e|
e['uuid'] == signature_field_uuid && e['submitter_uuid'] == submitter.uuid
end
reason_field = submitter.submission.template_fields.find do |e|View on GitHub (pinned to 004a22c1c8)
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.
Example fix
# before (completing while a conditionally-required field is blank)
Submitters::SubmitValues.update_submitter!(submitter,
{ values: { name_uuid => 'John' }, completed: 'true' }, request)
# after (fill the condition-required field too)
Submitters::SubmitValues.update_submitter!(submitter,
{ values: { name_uuid => 'John', tax_id_uuid => '123-45' }, completed: 'true' }, request) Defensive patterns
Strategy: validation
Validate before calling
# Before completing, recompute which fields are required and assert values
required_uuids = Submitters::SubmitValues # or replicate condition evaluation
# simpler: check every statically-required field is filled
missing = submission.template_fields
.select { |f| f['submitter_uuid'] == submitter.uuid && f['required'] }
.reject { |f| submitter.values[f['uuid']].present? }
.map { |f| f['uuid'] }
raise ArgumentError, "missing required fields: #{missing.join(', ')}" if missing.any? && completing Try / catch
begin
Submitters::SubmitValues.call(submitter, params, request)
rescue Submitters::SubmitValues::RequiredFieldError => e
# e.message is the field uuid — resolve it for the user
field = submission.template_fields.find { |f| f['uuid'] == e.message }
render json: { error: "Field '#{field && field['name']}' is required" }, status: :unprocessable_entity
end Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Invalid submitter params
- Defined more signing parties than in template
- Recipient emails should differ
- file param is missing
- File type '.#{extension}' is not allowed.
AI-assisted analysis of docusealco/docuseal@004a22c1c8 (2026-08-21).
Data as JSON: /api/errors/4c1a36836fb91912.
Report an issue: GitHub.