2009-03-25 4 views
3

J'ai changé mon contrôleur de spectacle pour trouver des enregistrements par leur permalien plutôt que leur id (pour la jutosité SEO).Trouver un projet par Permalink, 404 si pas trouvé

def show 
    @project = Project.find_by_permalink(params[:id]) 
end 

Mais, si je tape localhost: 3000/projets/foo (et il n'y a pas un projet avec un permalien foo) Je reçois une erreur de 500 serveur au lieu d'un 404 introuvable.

Pourquoi est-ce, et comment puis-je le réparer?

+0

Quel est le message d'erreur spécifique que vous obtenez dans la console Rails (ou development.log)? – marzagao

Répondre

7

Cela pourrait être un 2.3 plus, mais vous pouvez simplement utiliser un point de exclaimation après un chercheur dynamique comme celui-ci:

def show 
    @project = Project.find_by_permalink!(params[:id]) 
end 

Si rien ne se trouve une exception ActiveRecord::RecordNotFound est soulevée.

0

Je suppose obtiennent une erreur 500 parce que votre action show tente de faire référence à des attributs de @project lorsque la découverte est de retour nil

Vous devez vérifier pour vous assurer que @projects a des données et rendre une 404 à la main autrement . Sur mon site je rends une action personnalisée appelée « erreur » dans une situation similaire:

render :action => 'error', :status => 404 if @projects.blank? 

Si @projects existe, alors l'action show rend normalement.

0

Ou vous pouvez déclencher une exception 404.