2009-03-25 1 views
3

Я изменил свой контроллер шоу, чтобы найти записи по их постоянной ссылке, а не их идентификатор (для SEO-сочности).Найти проект по адресу Permalink, 404, если не найден

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

Но, если я типа в локальном хосте: 3000/проектов/Foo (а не проект с Foo Permalink) Я получаю ошибку 500 сервера вместо 404 не найден.

Почему это и как я могу это исправить?

+0

Какое конкретное сообщение об ошибке вы получаете в консоли Rails (или development.log)? – marzagao

ответ

7

Это может быть 2,3 дополнения, но вы можете просто использовать точку exclaimation после динамического искателя, как это:

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

Если ничего не будет найдено ActiveRecord::RecordNotFound исключения.

0

Я предполагаю, что получаю ошибку 500, потому что ваше шоу действия пытается ссылаться на атрибуты @project, когда находка возвращается nil

Вам нужно проверить, чтобы убедиться, что @projects имеют некоторые данные и сделать 404 вручную в противном случае , На моем сайте я сделать пользовательское действие под названием «ошибка» в аналогичной ситуации:

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

Если @projects существует, то показать действие оказывает как обычно.