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
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…
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
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.
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.