Problema complejo

Me estoy encontrado con un problema un tanto complejo que no se como
resolver, a ver si alguien tiene una iluminación.
Estoy desarrollando una aplicación de reserva de entradas para una
discoteca. Mediante un formulario se pide al usuari que esoja undia para
la reserva, introduzca el numero de entradas a reservar, su numero de
vip y los 4 primeros digitos de su DNI.
La idea es comprobar en la base de datos de vips que el numero de vip y
los 4 primeros digitos que ha introducido en el formulario concuerdan y
luego procesar la reserva guardandola en una tabla.
El proceso es:

  • Comprovar que ningun campo del formulario este vacío
  • Comprovar que los campos entradas, vip, dni sean numericos
  • Comprobar que los datos que ha entrado con correctos
  • Guardar

Mi primera idea era utilizar before_save y si la condición para crear la
reserva falla, realizar un flash notice y un redirect, pero me da error,
no deja introducir un redirect en el before_save

Alguna idea??

Gracias

On 7/2/07, Emili Parreño [email protected] wrote:

Mi primera idea era utilizar before_save y si la condición para crear la
reserva falla, realizar un flash notice y un redirect, pero me da error,
no deja introducir un redirect en el before_save

No sé si es el caso, pero un problema típico es que redirect_to no
termina el proceso de la acción, así que si se encuentra otro redirect
o un render, pues peta. Has de asegurarte que tu before_save devuelva
false en caso de que no quieras que se siga procesando.

Ya digo que por tu pregunta no se sabe exactamente si ese es el
problema, pero es un descuido bastante habitual…


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras

Como haces las comprobaciones?.. no usas los validates de los
modelos?..
Yo haría lo siguiente:

  • Comprovar que ningun campo del formulario este vacío

validates_pressence_of :entradas, :vip, :dni, :campo1 # y así todos los
del formulario

  • Comprovar que los campos entradas, vip, dni sean numericos

validates_numericality_of :entradas, :vip, :dni # para que sean números

  • Comprobar que los datos que ha entrado con correctos

Esto depende de lo que signifique “datos correctos”…

Mi primera idea era utilizar before_save y si la condición para crear la
reserva falla, realizar un flash notice y un redirect, pero me da error,
no deja introducir un redirect en el before_save

Además un before_save es un método de ActiveRecord (o sea de los
modelos), con lo que no se puede hacer un redirect_to dentro, porque eso
corresponde a los controladores…

Las comprobaciones están hechas como dices Moises:
validates_presence_of :vip_id, :dni, :entradas
validates_numericality_of :vip_id, :dni, :entradas

Lo que dices sergio de definir una validación sería la manera más
“elegante” de solucionarlo, porque pondria algo como
validates_vip_dni :vip_id, :dni

Si el numero de vip y el dni que ha entrado el usuario mediante el
formulario conicide con lo que hay en la base de datos, proceso la
reserva y la guardo, sinó, cuando haga el save mostrará un error.

Creo que voy a probar esta opción

Gracias

On 7/2/07, Moises D. [email protected] wrote:

Además un before_save es un método de ActiveRecord (o sea de los
modelos), con lo que no se puede hacer un redirect_to dentro, porque eso
corresponde a los controladores…

Cierto, lo que yo decía se refería a filtros del controlador
(before_filter, etc.)

Lo suyo como dice Moisés es que lo hagas con validación, sea
“automática” (validates_*) sea “a mano” si las validaciones son
máscomplejas (def validate, mírate los ejemplos que vienen en el Agile).

Una vez que hagas que el modelo valide, cuando hagas .save en el
controlador, te devolverá falso si las validaciones fallan, y es ahí
donde podrás hacer la redirección o lo que corresponda:

unless @objeto.save
flash, etc.
redirect_to, etc.
end

Por ejemplo.

Disculpa por la respuesta anterior, que despistaba más que ayudaba, no
entendí bien el problema.


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras