2010-02-25 4 views
33

Un utilisateur ne peut modifier son propre poste, donc j'utiliser ce qui suit pour vérifier si un utilisateur peut entrer dans le formulaire de modification:sauvetage de ActiveRecord :: RecordNotFound dans Rails

def edit 
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]}) 
    rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
    end 

Mais il ne fonctionne pas, tout idées ce que je fais mal?

Répondre

52

Si vous voulez utiliser l'instruction de sauvetage, vous devez utiliser find() d'une manière qu'il soulève des exceptions, qui est, en passant l'ID que vous voulez trouver.

def edit 
    @post = Load.scoped_by_user_id(session[:user_id]).find(params[:id]) 
rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
end 
+0

Merci @Simone Carletti c'est tout. – Adnan

6

Il se trouve que vous utilisiez rescue et que vous avez trouvé (: first) incorrectement.

find: first retourne zéro si aucun enregistrement ne correspond aux conditions. Il ne soulève pas ActiveRecord :: RecordNotFound

essayer

def edit 
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]}) 
    if @post.nil? 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
    end 
end 
+0

Je reçois « id appelé pour nul, ce qui serait à tort de 4 - si vous voulez vraiment l'ID de néant, utilisez object_id » – Adnan

+1

Vous utilisiez le sauvetage mal, mais le vrai problème est que trouver: premier renvoie zéro si aucun enregistrement n'est trouvé. Solution mise à jour pour répondre à la véritable racine de votre problème. – EmFi

+0

@DemitryT: Alors que votre code produirait le même résultat. Dans ce cas, j'ai choisi de l'écrire de cette façon, pour traiter explicitement l'erreur dans la question initiale. De même, je n'aime pas utiliser une instruction d'affectation comme condition. Je trouve la combinaison plus difficile à maintenir et déboguer. – EmFi

34

Vous pouvez également utiliser la méthode de rescue_fromActionController. Pour le faire pour l'ensemble de l'application à la fois!

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found 

    def record_not_found 
    render 'record_not_found' # Assuming you have a template named 'record_not_found' 
    end 
end 
+0

Pourquoi ai-je besoin du 'true' à la fin? Aussi, que voudrais-je inclure inclu de '# ...'? –

+0

@AlexPopov Bonne question, je ne me souviens pas pourquoi je l'ai posté comme ça. Je ne pense pas que vous en ayez besoin. –

+1

De même 'render 'record_not_found'' implique que vous devez avoir ce template. Alternativement, vous pouvez utiliser 'render text: 'Some message descriptif''. –

Questions connexes