2010-10-11 8 views
18

En mi controlador de permisos, que utilizan registro activo para buscar un permiso:Carriles 3 - Cómo no a error si ningún registro se encuentra

@permission = Permission.find(params[:user_id]) 

Si esto devuelve un resultado entonces miro el permiso. nombre Y pasa esto a mi controlador.

El problema es que a veces esto no devuelve el resultado, otras veces no lo hace. Cuando no lo hace, comete errores. ¿Cómo puedo evitar que ocurra?

Caso de uso: 1. Si el usuario tiene un registro de permiso, mostrar y dejar que cambiar el usuario que 2. En caso contrario, muestran que no tienen un registro de permiso y permiten al usuario configurar un permiso .

Gracias

Respuesta

46
@permission = Permission.find_by_id params[:user_id] 

La idea es que si se utiliza el "primer parámetro es el identificador de" versión de encontrar, usted sabe exactamente lo que está buscando, y si no está ahí, eso es un problema . Si utiliza una de las sintaxis de buscador más genéricas (como find_by_field_name), la suposición es que si no está allí, esa es una situación aceptable, así que simplemente devuelva nil.

+2

'@permission = Permiso.find_by (id: params [: user_id])' ahora. – hlcs

-8

creo que esto va a funcionar, yo no lo he probado.

if @permission 
    # Handle when the permission exists 
else 
    # Handle when the permission doesn't exist 
end 
+1

'ActiveRecord # find' con un parámetro int es un descubrimiento específico. Rails levanta 'RecordNotFound' si no se encuentra el registro. Esto es diferente de usar 'find' con parámetros como': first' o ': all', que es más una búsqueda; Rails devuelve nil para ningún registro en esos casos. (-1 para información incorrecta y no prueba) –

3

ActiveRecord#find con un parámetro int es un descubrimiento específico. Rails aumenta RecordNotFound si no se encuentra el registro.

Esto es diferente de usar find con parámetros como :first o :all, que es más de una búsqueda; Rails devuelve nil para ningún registro en esos casos. Si desea evitar que se produzca una excepción, use una de esas opciones o los nombres de método correspondientes.

Ejemplo:

@permission = Permission.find(:first, :id => params[:id]) 
+0

Ah, me olvidé de 'find_by_ [columna]'. Use eso en su lugar (vea la respuesta de Matt Briggs). Puede ser un poco más lento debido a 'method_missing', pero es más intuitivo. –

2

La otra manera:

@permission = Permission.find_all_by_id params[:user_id]

Creo que es útil si user_id es una matriz

+2

Tenga en cuenta que 'find_all_by_ *' quedará obsoleto en Rails 4. – clem

9

Sé que esto es viejo, pero acabo de encontrar esto y quiero sugerir una forma diferente de manejar esta situación. ActiveRecord::RecordNotFound no hay nada que temer. Un usuario puede pasar una identificación de registro válida, pero ese registro puede no pertenecer a ellos (es decir, si hace algo como current_user.widgets.find(params[:id])). Prefiero manejarlo así:

def show 
    begin 
    @permission = Permission.find(params[:user_id]) 
    rescue ActiveRecord::RecordNotFound 
    # however you want to respond to it 
    end 
end 
+2

En general, es una mala idea probar por error, pero le di un voto positivo para mostrar una forma alternativa de hacerlo. –

Cuestiones relacionadas