Actions (Submits)

#[submit] handlers process form POSTs with typed validation and field-level errors.

LIVE

#[submit] handler

Same docs_greet handler — focus here is the submit endpoint and JSON response.

Define a submit handler

The live demo above uses docs_greet — same pattern as below.

#[data]
struct GreetForm {
    name: String,
}

#[submit]
async fn docs_greet(form: GreetForm, _req: &FlowRequest)
    -> Result<GreetResult, SubmitError>
{
    if form.name.trim().is_empty() {
        return Err(SubmitError::new("Fix errors")
            .field("name", "Required"));
    }
    Ok(GreetResult { message: format!("Hello, {}!", form.name.trim()) })
}

Wire to Form

view! {
    <Form submit={docs_greet}>
        <input name="name" type="text" required />
        <button type="submit">"Greet"</button>
    </Form>
}

SubmitError

Return structured validation errors. The runtime maps field_errors to form fields when using client enhancement.

SubmitError::new("Invalid input")
    .field("email", "Must be a valid email")
    .field("message", "Too short")

HTTP endpoint

Forms POST to /_resuma/submit/:name. Works without JavaScript via standard form submission.