2010-04-02 9 views
9

Ich arbeite mit dem folgenden Stück;Arbeit mit Rettung in Schienen

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

Nun ich jedem Fall, ob ich eine korrekte ID haben oder nicht, ich bin immer auf „OK“ meiner Meinung nach bekommen, was mache ich falsch?

Ich brauche das, wenn ich keine ID in der DB habe, um "ERROR" anzuzeigen. Ich habe auch versucht, rescue ActiveRecord::RecordNotFound zu verwenden, aber das gleiche passiert.

Alle Hilfe ist willkommen.

+0

Ist der tatsächliche Code aus Ihrer app? Es sieht so aus, als ob Sie zurück zur selben Aktion (Index) umleiten, was zu einer Endlosschleife führt. – mikej

Antwort

30

Der gesamte Code nach dem Ende des Rettungsblocks wird nur interpretiert, wenn im Rettungsblock keine Rückkehr erfolgt. Sie können also am Ende Ihres Rettungsblocks zurückrufen.

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 

oder

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 

Aber in Ihrem Fall ist die bessere rescue_from oder rescue_in_public

wie

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 

Aber die Verwendung von rescue_in_public zu verwenden, ist nicht wirklich ein guter Rat

-5

Wenn kein user mit diesem id vorhanden ist, wird User.findnil zurückgeben. Die Rückgabe nil ist kein Fehler und löst keinen rescue aus.

+0

danke @Justice vergaß, dass es Null zurückgibt. – Adnan

+8

Ich bin mir ziemlich sicher, dass das nicht stimmt. 'find' mit einer ungültigen ID wird' ActiveRecord :: RecordNotFound' auslösen. Wenn Sie einen der dynamischen Sucher z. 'User.find_by_name' mit einem Wert, der keinem Datensatz entspricht und dann' nil' zurückgibt. Siehe http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263 – mikej

+1

Nun, Sir, ich habe überprüft und Sie haben Recht. Vielen Dank. Der Suchaufruf in der OP sollte tatsächlich auslösen, es sei denn, der Code ist tatsächlich 'User.find (: first, params [: id])'. – yfeldblum

2

Nur eine Gesamt Rails Rettungs Antwort:

Ich fand das sehr cool sein:

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