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

  1. Inspect the field uuid in the message against submission.template_fields to find its name and condition, then supply a value for it.
  2. Recompute condition visibility server-side before completion: any field whose condition evaluates required must be present in submitter.values.
  3. For partial saves use completed != 'true' (or validate_required: false on the internal call), which logs a Rollbar warning instead of raising.
  4. 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

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


AI-assisted analysis of docusealco/docuseal@004a22c1c8 (2026-08-21). Data as JSON: /api/errors/4c1a36836fb91912. Report an issue: GitHub.