Ir al contenido

Un formulario rechazado conserva lo escrito ​

Traducción automática

Esta página se tradujo automáticamente del inglés y todavía no la revisó un hablante nativo; las correcciones son bienvenidas en GitHub. Si algo no coincide, vale el original en inglés.

Tarea: cuando el servidor rechaza un formulario, devolverlo con lo que la persona escribió, no vacío.

yaml
# Recipe: a refused form comes back with what was typed, not empty.
paths:
  components: ./components
  migrations: ./migrations

datasources:
  db:
    driver: sqlite
    database: ./data/messages.db
sql
CREATE TABLE messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    email TEXT NOT NULL,
    body TEXT NOT NULL
);

No hay nada que escribir para esto. Después de un rechazo, el siguiente renderizado de un ui:form llena cada campo con el valor enviado, una vez, como el mensaje flash. Un campo de contraseña o de archivo nunca vuelve. rows="6" hace del mensaje un campo de varias líneas.

xml
<q:component name="Contact">
  <q:action name="send" method="POST">
    <q:param name="email" type="email" required="true" />
    <q:param name="body" required="true" minlength="20" maxlength="2000" />
    <q:query name="saved" datasource="db">
      INSERT INTO messages (email, body) VALUES (:email, :body)
      <q:param name="email" value="{email}" type="string" />
      <q:param name="body" value="{body}" type="string" />
    </q:query>
    <q:redirect url="/" flash="Thanks, we got your message." />
  </q:action>

  <ui:window title="Contact us">
    <q:if condition="flash">
      <ui:alert variant="{flashType == 'error' and 'danger' or 'success'}">{flash}</ui:alert>
    </q:if>
    <!-- Nothing to write for the values: after a refusal, the next render of
         this form fills each field with what was sent (UI-9), once. -->
    <ui:form on-submit="send">
      <ui:formitem label="Your e-mail"><ui:input bind="email" /></ui:formitem>
      <ui:formitem label="Message"><ui:input bind="body" rows="6" /></ui:formitem>
      <ui:button variant="primary">Send</ui:button>
    </ui:form>
  </ui:window>
</q:component>

La primera prueba envía una dirección mala con un mensaje bueno: la dirección se rechaza y el mensaje sigue en su campo. La segunda abre la página de nuevo: los valores ya no están.

xml
<q:test name="a refused message comes back as it was typed" page="/">
  <test:submit action="send" email="ana@example" body="Your shop is closed on Sundays?" />
  <test:expect redirect="/" />
  <test:expect error="email" message="Must be a valid email" />
  <test:expect text="Your shop is closed on Sundays?" />
  <test:expect table="messages" count="0" />
</q:test>

<q:test name="the values come back once: the next visit is empty" page="/">
  <test:submit action="send" email="ana@example" body="Your shop is closed on Sundays?" />
  <test:visit />
  <test:expect no-text="Your shop is closed on Sundays?" />
</q:test>

<q:test name="a valid message is saved" page="/">
  <test:submit action="send" email="ana@example.com" body="Your shop is closed on Sundays?" />
  <test:expect redirect="/" flash="Thanks, we got your message." />
  <test:expect table="messages" count="1" where="email = 'ana@example.com'" />
</q:test>
text
tests/contact.test.q
  PASS  a refused message comes back as it was typed
  PASS  the values come back once: the next visit is empty
  PASS  a valid message is saved
3 passed, 0 failed

Ver UI-9 y, para el campo de varias líneas, UI-14.

Licencia MIT · Hecho con VitePress