Forms on Rails

por Ariel Juodziukynas

Slides: https://tinyurl.com/formsonrails

Múltiples submit

    Un formulario puede tener más de un botón para enviarlo.

    El valor del botón presionado se envía en los parámetros del request.

Demo 1

  • No usar "action" como el nombre del botón.
  • También funciona con inputs, pero el valor es el texto visible.
  • No es necesario que todos los botones tengan el mismo nombre.
  • "Enter" equivale a enviar con el primer botón que aparece.

Múltiples action/method

    Los diferentes botones pueden tener distinto "action" (url) y "method" (GET|POST|PATCH|DELETE) independiente del form.

Atributos formaction y formmethod

  • Ambos se pueden usar en cualquier elemento que envía el formulario.
  • `formmethod` sólo acepta `post` y `get` como valores, pero usando una convención de Rails se pueden user otros métodos HTTP.

Demo 2

  • No se pueden tener varios botones con el mismo método HTTP no estándard con distinto nombre/valor.

Inputs afuera de formularios

    Los inputs no necesitan ser hijos de un formulario.

    Se pueden asociar mediante ids y el atributo `form`.

Demo 3

  • No se puede asociar un mismo input a más de un form.

Custom Form Builder

    Permiten definir métodos y templates específicos del builder sin modificar la vista.

Demo 4

  • Se pueden definir nuevos métodos, no es necesario respetar o sobreescribir los métodos del FormBuilder base.

Formularios anidados

    Un formulario puede crear un objeto y objectos asociados en un mismo request.

    Sirve tento para relaciones uno-a-uno y uno-a-muchos.

La convención de la estructura de los parámetros

Para relaciones uno-a-uno:

              
								{
									user: {
										address_attributes: {
											street: 'Calle Falsa 123',
											city: 'Springfield'
										}
									}
								}

								# user[address_attributes][street]=Calle+Falsa+123&user[address_attributes][city]=Springfield
              
						

La convención de la estructura de los parámetros

Para relaciones uno-a-muchos:

              
								{
									user: {
										pets_attributes: {
											1: {
												id: 1,
												name: '',
												breed: ''
											},
											2: {
												id: 2,
												name: '',
												breed: '',
												:_destroy => 1
											},
											3: {
												# hashes sin atributo "id" para crear nuevos objetos
												name: '',
												breed: ''
											}
										}
									}
								}
								# user[pets_attributes][1][id]=1&...
							
						

`accepts_nested_attributes_for`

    Agrega métodos al modelo para asignar attributos de objectos asociados.

`fields_for`

    Se usa dentro de uno form para generar un FormBuilder para otro object.

Strong Parameters

    Hay que permitir los parámetros de acuerdo a la convención.

Demo 5

Agregar/quitar elementos sin recargar

    Agregar/quitar fields usando JavaScript.

    Hay varias gemas para simplificar esto.

Demo 6

Gracias!

Preguntas?