2010-04-02 5 views
9

Je travaille avec la pièce suivante;travail avec le sauvetage dans 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 

Maintenant, je les deux cas, si je possède un numéro correct ou non, je suis toujours obtenir « OK » à mon avis, ce que je fais mal?

J'ai besoin que lorsque je ne ID dans le DB pour voir « ERREUR ». J'ai également essayé d'utiliser rescue ActiveRecord::RecordNotFound mais la même chose arrive.

Toute aide est appréciée.

+0

Est-ce code réel de votre application? En l'état, il semble que vous redirigiez vers la même action (index), ce qui se traduira par une boucle infinie. – mikej

Répondre

30

Tout le code après la fin du bloc de sauvetage est interprété que s'il n'y a aucun retour dans le bloc de sauvetage. Vous pouvez donc appeler le retour à la fin de votre bloc de sauvetage.

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 

ou

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 

Mais dans votre cas, le mieux est d'utiliser rescue_from ou rescue_in_public

comme

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 

Mais l'utilisation de de rescue_in_public n'est pas vraiment de bons conseils

-5

S'il n'y a pas de user avec id, alors User.find renverra nil. De retour nil est pas un cas d'erreur et ne déclenche pas un rescue.

+0

merci @Justice oublié qu'il retourne nul. – Adnan

+8

Je suis assez sûr que ce n'est pas juste. 'find' avec un ID invalide augmentera' ActiveRecord :: RecordNotFound'. Si vous utilisez l'un des trouveurs dynamiques, par ex. 'User.find_by_name' avec une valeur qui ne correspond pas à un enregistrement, cela retournera' nil'. Voir http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263 – mikej

+1

Eh bien monsieur, j'ai vérifié et vous avez raison. Je vous remercie. L'appel de recherche dans l'OP devrait augmenter, sauf si le code est réellement 'User.find (: first, params [: id])'. – yfeldblum

2

Juste une réponse globale Rails de sauvetage:

Je trouve cela très cool:

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