2012-03-14 23 views
27

Tengo una tabla que incluye un "pertenece a" en el modelo. La tabla incluye el campo xx_id para vincular las dos tablas.Rails encontrar recibiendo ActiveRecord :: RecordNotFound

Pero, a veces, el xx_id va a estar en blanco. Cuando lo es, obtengo ActiveRecord :: RecordNotFound. No deseo un error: solo quiero una pantalla en blanco para este campo.

¿Qué es lo que sugiere?

+0

¿Cómo lo está cargando para obtener este error? – tadman

+0

Publica tu código de controlador. – James

+0

Estoy pensando algo así como 'si xx_id.nil? "" 'sintaxis que dejaría el campo predeterminado en blanco si el registro es' nil' pero no está seguro si eso cubriría el caso de No Encontrado. – ScottJShea

Respuesta

68

Los raíles siempre generarán una excepción ActiveRecord :: RecordNotFound cuando utilice el método find. Sin embargo, los métodos find_by_* devuelven nil cuando no se encuentra ningún registro.

El ActiveRecord documentation nos dice:

RecordNotFound - Ningún registro respondió al método find. O bien la fila con la ID proporcionada no existe o la fila no cumplió con las restricciones adicionales . Algunas llamadas de búsqueda no plantean esta excepción para indicar que no se encontró nada, consulte la documentación correspondiente al para obtener más información.

Si desea volver nil cuando los registros no se pueden encontrar, sólo tiene que manejar la excepción de la siguiente manera:

begin 
    my_record = Record.find params[:id] 
rescue ActiveRecord::RecordNotFound => e 
    my_record = nil 
end 
+33

Creo que el uso de 'find_by_id' es una mejor solución para devolver' nil' en lugar de capturar una excepción. –

+0

Estoy de acuerdo :) '@model = Model.find_by_id (params [: model_id]) if @ model.nil? ... ' – lboix

+3

Los métodos dinámicos' find_by' son vulnerables a la Inyección SQL, así que intente utilizar el método find como se sugiere en la respuesta. http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/ –

1

Cuando se llama a encontrar, podrás obtener una matriz. Cuando la matriz no contiene objetos, el recuento es cero.

items = Store.find(:all, :conditions => {:resource_id => item.id}) 
if item.count == 0 puts " !not found for item id#{item.id}" 

o

if item.nil? puts " !not found for item id#{item.id}" 
+0

Nota: esto no se aplica cuando se llama a find con un id – DSimon

4

No se pudo escribir

my_record = Record.find(params[:id) rescue nil 
+4

Esto también descartará cualquier error que no sea 'ActiveRecord :: RecordNotFound'. Si desea ir con la solución de rescate en lugar de '.find_by_id', sería mejor rescatar del error esperado específico. –

+0

las excepciones ruby ​​son un poco caras ... – Filippos

+0

no optimice prematuramente – PhilT

1
Record.find_by(id: params[:id]) 

vuelve Record objeto si se encuentra o nil si no lo es.

Cuestiones relacionadas