Как реализовать динамические страницы ошибок 404, 500 и т. Д. В Rails? - PullRequest
7 голосов
/ 03 июня 2009

Как реализовать динамические, настраиваемые страницы ошибок в Rails?

Например, пользовательская страница ошибки 404 с использованием макета application.html.erb и некоторые динамические поля на странице.

Кроме того, как можно проверить это с локальной машины?

Ответы [ 5 ]

13 голосов
/ 10 февраля 2010

Я посмотрел несколько постов в блоге о том, как это сделать, к сожалению, большинство, похоже, полагается на загрязнение вашего ApplicationController.

Вместо этого я создал шаблон с сообщением 404, а затем использовал этот шаблон для обновления файла public / 404.html из задачи rake:

# Rake file to generate static 404 page

file "public/404.html" => ["app/views/layouts/application.html.erb"] do |t|
    print "Updating 404 page\n"
    `curl --silent http://locahost/content/error404 -o public/404.html`
end 

Теперь, когда я обновляю свой глобальный макет, страница 404 обновляется автоматически.

9 голосов
/ 03 июня 2009

просто добавьте в свой ApplicationController следующее:

  rescue_from ActiveRecord::RecordNotFound, :with => :render_record_not_found

  # Catch record not found for Active Record
  def render_record_not_found
    render :template => "shared/catchmissingpage", :layout => false, :status => 404
  end

  # Catches any missing methods and calls the general render_missing_page method
  def method_missing(*args)
    render_missing_page # calls my common 404 rendering method
  end

  # General method to render a 404
  def render_missing_page
    render :template => "shared/catchmissingpage", :layout => false, :status => 404
  end

Вы можете настроить вызов рендеринга (использовать шаблоны, макет и т. Д.) И таким образом отлавливать ошибки. Теперь он ловит недостающий метод и record_not_found для вас, но, возможно, в некоторых случаях вы хотите отобразить страницу с ошибкой 500, чтобы вы могли просто продолжить, использовать этот подход и сделать его подходящим для вас.

Для тестирования с локальной машины это просто работает так. если вы хотите, чтобы он работал только в производственном режиме, добавьте

 if ENV['RAILS_ENV'] == 'production'

и ты в порядке.

6 голосов
/ 03 июня 2009

Чек Пост Хенрика Найха . Другие тоже можно найти через Google.

Идея заключается в том, что Rails рендерит public/404.html для 404 ошибок.

  • Вы можете перезаписать страницу, если хотите отобразить статическое поле
  • Для динамического содержимого кажется, что вы можете переопределить метод фреймворка, чтобы подключить и перенаправить его для отображения динамической страницы.

ActionController::Rescue определяет rescue_action_in_public, который вызывает render_optional_error_file.

3 голосов
/ 05 июня 2009

Если вы решили создать динамическую страницу 404 (или другой код состояния), обязательно удалите соответствующий HTML-файл из /public (если он существует)

1 голос
/ 17 сентября 2010

На фронте тестирования действительно хороший способ сделать это (по крайней мере, в целях разработки) - это использовать Passenger и настроить рабочую среду rails (или закомментировать «RailsEnv development» в конфигурации сайта). По крайней мере, так вы можете имитировать, как это работает в производстве.

Но для этого у меня есть множество файлов настроек, которые анализируются при запуске и выбираются в зависимости от среды. Один из параметров - показывать ли страницы ошибок (AppSettings.show_page_errors?). Тогда в моем контроллере приложений у меня есть

  if !AppSettings.show_page_errors?
    alias_method :rescue_action_locally, :rescue_action_in_public
  end

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

Другим шагом является использование пользовательских страниц. В моем случае у меня есть шаблоны, основанные на ошибке, которые также включают форму для отправки в формы Google (так как мой сервер может быть поврежден). Для этого поместите это (и при необходимости измените) в свой контроллер приложений:

def render_optional_error_file(status_code)
  status = interpret_status(status_code)
  render :template => "/errors/#{status.to_s[0,3]}.html.haml", :status => status, :layout => 'application.html.haml' if [404, 422, 500].include?(status)
  render :template => "/errors/unknown.html.haml", :status => status, :layout => 'application.html.haml' unless [404, 422, 500].include?(status)
end

Это сделает коды состояния 404, 422 и 500, используя шаблон, но в противном случае он использует неизвестный. Если вам нужно работать с другими, просто обновите этот метод и добавьте шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...