2010-04-02 9 views
9

Estoy trabajando con la siguiente pieza;trabajo con rescate en Rails

def index 
    @user = User.find(params[:id]) 
    rescue 
    flash[:notice] = "ERROR" 
    redirect_to(:action => 'index') 
    else 
    flash[:notice] = "OK" 
    redirect_to(:action => 'index') 
end 

Ahora cualquier caso si tengo una identificación correcta o no, yo siempre estoy recibiendo "OK" en mi opinión, lo que estoy haciendo mal?

Necesito eso cuando no tengo ID en el DB para mostrar "ERROR". También intenté usar rescue ActiveRecord::RecordNotFound, pero sucede lo mismo.

Toda ayuda es apreciada.

+0

¿Es este código en cuestión de la aplicación? Tal como está, parece que estás redireccionando a la misma acción (índice) que dará como resultado un ciclo infinito. – mikej

Respuesta

30

Todo el código después del final del bloque de rescate se interpreta solo si no hay devoluciones en el bloque de rescate. Entonces puede llamar al retorno al final de su bloque de rescate.

def index 
    begin 
    @user = User.find(params[:id]) 
    rescue 
    flash[:notice] = "ERROR" 
    redirect_to(:action => 'index') 
    return 
    end 
    flash[:notice] = "OK" 
    redirect_to(:action => 'index') 
end 

o

def index 
    @user = User.find(params[:id]) 
    # after is interpret only if no exception before 
    flash[:notice] = "OK" 
    redirect_to(:action => 'index') 
rescue 
    flash[:notice] = "ERROR" 
    redirect_to(:action => 'index') 
end 

Pero en su caso, el mejor es utilizar rescue_from o rescue_in_public

como

class UserController < ApplicationController 
    def rescue_in_public(exception) 
    flash[:notice] = "ERROR" 
    redirect_to(:action => 'index') 
    end 

    def index 
    @user = User.find(params[:id]) 
    flash[:notice] = "OK" 
    redirect_to(:action => 'index') 
    end 
end 

Sin embargo, el uso de rescue_in_public no es realmente un buen consejo

-5

Si no hay user con id que, a continuación, User.find volverá nil. Devolver nil no es un error y no activará rescue.

+0

gracias @Justice olvidó que devuelve nil. – Adnan

+8

Estoy bastante seguro de que esto no está bien. 'find' con un ID no válido aumentará' ActiveRecord :: RecordNotFound'. Si usa uno de los buscadores dinámicos, p. 'User.find_by_name' con un valor que no coincide con un registro, entonces devolverá' nil'. Ver http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263 – mikej

+1

Bueno, señor, lo revisé y usted está en lo cierto. Gracias. La llamada de búsqueda en el OP debería realmente aumentar, a menos que el código sea realmente 'User.find (: first, params [: id])'. – yfeldblum

2

Sólo una respuesta global rieles de rescate:

He encontrado que esto es muy fresco:

@user = User.find(params[:id]) rescue "" 
Cuestiones relacionadas