Как отобразить пользовательские 404 для каждого контроллера?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Возможно ли отображать разные страницы ошибок в зависимости от контроллера?

Ответ №1:

Для Rails < 3.0.

Да, это возможно. Я использую этот метод в своем контроллере приложения для отображения сообщения 404:

 def render_optional_error_file(status_code)
  status = interpret_status(status_code)[0,3]
  if status == "404"
    render :template => "/errors/404.html.erb", :status => status
  else
    render :template => "/errors/error.html.erb", :status => status
  end
end
  

Итак, единственное, что вам нужно сделать, это написать этот метод для каждого контроллера, или вы можете изменить render строку на что-то вроде этого:

 render :template => error_page, :status => status
  

и добавить метод:

 def error_page
  "/errors/404.html.erb"
end
  

Тогда вам нужно только написать error_page метод в каждом контроллере, где вы хотите изменить страницу ошибки по умолчанию.

РЕДАКТИРОВАТЬ: Ups, я только что заметил, что этот метод устарел в Rails 3. Итак, должен быть другой способ сделать это.

Для Rails > = 3.0:

Вот один пример решения для этого. Просто добавьте:

 rescue_from ActionController::RoutingError, :with => :render_404
  

и добавить render_404 метод:

 def render_404
  render :file => "errors/404.html.erb", :status => 404
end
  

Или, если вы хотите добавить 404.html.erb представление для каждого контроллера без изменения кода контроллеров, вы можете написать это следующим образом:

 def render_404
  render "404.html.erb", :status => 404
end
  

Я думаю, что следует искать этот файл ошибки внутри каталога просмотра текущего контроллера. Я не проверял это, но я думаю, что это должно сработать. Но не забудьте включить 404.html.erb файл в каталог просмотра каждого контроллера. В противном случае может возникнуть ошибка.

Комментарии:

1. Спасибо. Поэтому я должен дублировать его в каждом контроллере. Я нашел метод, который работает в Rails 3: blog.igodigital.com/blog /…