2011-01-05 18 views
12

¿Cómo puedo manejar ActiveRecord::RecordNotUnique excepción en el controlador? GraciasRails 3: Manejar ActiveRecord :: RecordNotUnique Excepción

Editar: Estoy obteniendo esa excepción al generar un código único. Puedo manejar la excepción en el application_controller.rb pero lo que realmente quiero es que el código se genere nuevamente y eso debe hacerse en el controlador.

generate_code 
@couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 

Edit2:

generate_code 

begin 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 
rescue ActiveRecord::RecordNotUnique 
    #generate_code 
    @code = "111-11111" 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code)   
end 
+0

Tal vez un poco más de código? Creo que está obteniendo esa excepción cuando intenta guardar el registro y esa parte no está incluida en su ejemplo. – Heikki

+0

Sí, eso es correcto. Gracias. – donald

Respuesta

21
begin 
    # do stuff 
rescue ActiveRecord::RecordNotUnique 
    # handle the exception however you want to 
end 

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

También es posible usar rescue_from si es algo que tienes que hacer frente a menudo.

+0

He editado la pregunta con el nuevo código. Lo he intentado sin el @couponcode en el rescate y con. El error sigue siendo el mismo, todavía hay una excepción que no se maneja. – donald

+0

¿Seguro que el error viene de la línea de '.new' y no donde' .save' se llama? La documentación para [ActiveRecord :: RecordNotUnique] (http://api.rubyonrails.org/classes/ActiveRecord/RecordNotUnique.html) sugieren que sería levantado cuando el registro se guarda en la base de datos. En cualquier caso, tratar de hacer más o menos lo mismo en un bloque de rescate provocará dolor a largo plazo. Si está esperando el error, desde el punto de vista del usuario, debe tratarlo con más elegancia (como el uso de validaciones y errores de formulario). – idlefingers

+0

Si no estás esperando el error, pero está sucediendo mucho, usted debe tratar de llegar a la raíz del problema, no sólo suprimirlo. Perdón por el doble comentario, ¡así que la limitación de la longitud de los comentarios! :) – idlefingers

1

Usted puede agregar una validación singularidad y aún así tener la oportunidad de cambiar el código sin tener que utilizar rescate.

couponcode.rb

validates_uniqueness_of :code 

controlador:

@couponcode = Couponcode.new(:user_id => current_user.id) 
begin 
    couponcode.code = generate_code 
    # might want to break out after a limit here 
end until @couponcode.valid? 
@couponcode.save 

Pero también se podría utilizar un UUID y sería única, sin un cheque.

4

El uso de este método de validación validate_uniqueness_of no garantiza la ausencia de inserciones de registros duplicados.

Debe buscar here

Cuestiones relacionadas