2011-07-25 13 views
6

En mi edición de acción, que tienenManejo de ActiveRecord :: RecordNotFound en Ruby on Rails

@item = current_user.shop.items.find(params[:id]) 

para que el usuario sólo puede editar los artículos que pertenecen a su tienda. Si intentan editar un artículo que no pertenece a su tienda, entonces obtienen un error ActiveRecord :: RecordNotFound.

¿Cuál es la mejor forma de manejar este error en situaciones como esta? ¿Debo presentar una excepción? ¿Debería redirigir a algún lugar y configurar el flash? De ser así, ¿cómo hago eso? ¿Debería dejarlo como está? Cualquier consejo es apreciado.

Gracias

Respuesta

20

añadir algo como lo siguiente a su controlador:

rescue_from ActiveRecord::RecordNotFound do 
    flash[:notice] = 'The object you tried to access does not exist' 
    render :not_found # or e.g. redirect_to :action => :index 
end 
+0

Awesome answer, Thanks me ayuda mucho. – SSR

19

+1 para la solución de @Koraktor. Si desea evitar ActiveRecord :: RecordNotFound, puede usar el método find_by en lugar de find.

@item = current_user.shop.items.find_by_id(params[:id]) 
if @item.nil? 
    flash[:error] = "Item not found" 
else 
    # Process the @item... 
end 
4

Adicionalmente se debe configurar el estado HTTP al intentar mostrar la plantilla:

rescue_from ActiveRecord::RecordNotFound do 
    render :not_found, :status => :not_found 
end 

Comprobar la (sección 2.2.13.4) Rails guide de la lista de estado.

Como se indica en otro lugar (por ejemplo, here), nunca debe hacer una redirección al enviar un estado de 40x, solo los estados de 30x deben permitir el redireccionamiento. Por lo tanto, es posible que encuentres una página extraña de "Te están redireccionando" cada vez que tratas de hacer una redirección con un estado: not_found.