Capturar error de validación en transac ción

Hola a todos. Mi pregunta es la siguiente:

Si tengo una transacción

A.transaction do

b.save!
a=A.new
a.b_id=b.id
a.save!
end

Obviando el hecho de que puedo anidar la composición de objetos dentro
de un
if
¿Hay alguna forma de que al capturar la excepción de save! por error de
validación pueda mostrar cuales fueron los errores para mostrarlos? Se
que
puedo hacer esto:


rescue ActiveRecord::RecordInvalid => invalid
errors=invalid.record.errors #capturo los errores
end

pero ¿como hago para propagar esos errores como se hace normalmente en
un
formulario?

un saludo y gracias.

On Thu, Jun 19, 2008 at 7:44 PM, Rafa C. [email protected] wrote:

Hola a todos. Mi pregunta es la siguiente:

Si tengo una transacción

A.transaction do

b.save!
a=A.new
a.b_id=b.id
a.save!

Si B has_many :aes eso se escribiria asi:

b.aes.build
b.save!

Eso es todo, no hay bloque transaccion, si bien todo sucede en una
transaccion dentro de save!.

Por otro lado, para validar los hijos al grabar el padre pondrias

class B
has_many :aes
validates_associated :aes
end

para que pete el save! si falla la validacion de la a que as asociado.

En general en AR hay que trabajar desde el padre de la relacion y
tirando de la API que los has_many and friends ofrecen, si te ves
usando un ID suelto tate! Salvo que lo hagas a proposito por algun
tema, lo normal es no ver ninguno y trabajar siempre a nivel de
modelos.

¿entonces .build llama a los validadores? supongo que dejará un flag que
le
indique a save! que no debe volver a validar nada.

Lo que supono que me dices es que en lugar de

a.b_id=b.id

haga directamente

b.add(a1)
b.add(a2)

b.save (o b.aes.build;b.save!)

¿esto guardaría b y los a nuevos o modificados?

El día 19 de junio de 2008 20:03, Xavier N. [email protected]
escribió:

2008/6/19 Rafa C. [email protected]:

¿entonces .build llama a los validadores?

Nope, validates_associated se ejecuta cuando el resto de validaciones,
en b.save!.

b.save (o b.aes.build;b.save!)

¿esto guardaría b y los a nuevos o modificados?

Esa es la idea.

Para terminar de ponerlo en claro entonces:

debo poner

has_many …
validates_associated …

def guardar

b=… #new o find
… # generamos aes, sin usar a.save
for a in aes
b.add(a)
end

b.save

end

y el b.save recopila todos los errores de validación existentes y tiene
su
propia transacción.

Despues si creo otros aes

a.b=b
b.save

esto no actualizaría b, solo a con su b_id

El día 19 de junio de 2008 21:47, Xavier N. [email protected]
escribió:

2008/6/19 Xavier N. [email protected]:

b << a

b.aes << a

2008/6/19 Rafa C. [email protected]:

b=… #new o find
… # generamos aes, sin usar a.save
for a in aes
b.add(a)

b << a

end

O bien b.aes.(build|create) directamente en lugar de crear aes
silvestres.

a.b=b
b.save

esto no actualizaría b, solo a con su b_id

Eso es, AR esta pensado para ir de padres a hijos como pauta general.

ok
debo crear hijos “silvestres” porque tengo que pasarles otro dato

Perfecto, muchas gracias

2008/6/19 Xavier N. [email protected]:

2008/6/19 Rafa C. [email protected]:

ok
debo crear hijos “silvestres” porque tengo que pasarles otro dato

hijo = padre.hijos.build(params[:hijo])
hijo.parametro_protected = tal_cosa
padre.save

Has de mirarte un poco la API de AR.