Пользовательские страницы ошибок в Rails? - PullRequest
22 голосов
/ 10 февраля 2010

Мне нужно реализовать пользовательскую страницу ошибок в моем приложении rails, которая позволяет мне использовать erb.

Я следовал этому руководству (http://blog.tommilewski.net/2009/05/custom-error-pages-in-rails/) и не могу заставить его работать локально (или удаленно). Я использую Rails 2.3.5

Вот суть подхода.

1) в 'application_controller' я перехожу на метод "render_optional_error_file (status_code)" и устанавливаю видимость "protected", как это.

protected

def render_optional_error_file(status_code)
  known_codes = ["404", "422", "500"]
  status = interpret_status(status_code)

  if known_codes.include?(status_code)
    render :template => "/errors/#{status[0,3]}.html.erb", :status => status, :layout => 'errors.html.erb'
  else
    render :template => "/errors/unknown.html.erb", :status => status, :layout => 'errors.html.erb'
  end
end

def local_request?
  true
end

Я также создал папку в представлениях с именем errors и создал следующие представления: 404.html.erb, 422.html.erb, 500.html.erb, unknown.html.erb и создал новый макет "errors.html.erb"

Я не могу заставить его работать. Я пытался вызвать страницу 404, перейдя на http://localhost:3000/foobar - но вместо того, чтобы получить новый 404.html.erb, я, похоже, получаю стандартную ошибку apache 500. Это происходит, когда я пробую и mongrel_rails start, и mongrel_rails start -e production.

Ответы [ 4 ]

32 голосов
/ 17 февраля 2010

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

Сначала объявите некоторые (я обычно делаю это в application_controller.rb)

class Error404 < StandardError; end
class PostNotFound < Error404; end

Затем добавьте код в ApplicationController для их обработки

class ApplicationController < ActionController::Base

  # ActionController::RoutingError works in Rails 2.x only.
  # rescue_from ActionController::RoutingError, :with => :render_404
  rescue_from Error404, :with => :render_404
  rescue_from PostNotFound, :with => :render_post_not_found


  def render_404
    respond_to do |type| 
      type.html { render :template => "errors/error_404", :status => 404, :layout => 'error' } 
      type.all  { render :nothing => true, :status => 404 } 
    end
    true
  end

  def render_post_not_found
    respond_to do |type| 
      type.html { render :template => "errors/shop_not_found", :status => 404, :layout => 'error' } 
      type.all  { render :nothing => true, :status => 404 } 
    end
    true
  end
end

Отображает ошибки / ошибки_404 с макетом ошибок. Должны ли вы начать:)

А в вашем target_controller:

raise PostNotFound unless @post

Редактировать

Примечание для Rails 3

для более подробного объяснения того, почему ActionController :: RoutingError не работает для rails 3: Обработка исключений Rails 3.0 .

Рельсовый билет 4444

"Если ваше приложение использует движки, расширяющие ваше приложение своими собственные маршруты, вещи сломаются, потому что эти маршруты никогда не получат уволен! "

2 голосов
/ 22 февраля 2010

Во-первых, удалили ли вы файл: 'public / 500.html' Если этот файл существует, он переопределит все, что вы пытаетесь сделать.

Во-вторых, использование явного «rescue_from» в контроллере (как объяснено в другом комментарии) - хороший вариант, если вам нужно точно настроить ответ на различные виды ошибок.

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

Скорее всего, вы получите ошибку 500 из-за ошибки приложения. Вы проверяли файлы журнала?

Обновление:

Вы уверены, что используете 2.3.5, а не старую версию, которая установлена? Mongrel должен указать, какую версию вы используете при запуске, в противном случае он должен указать в файле config / environment.rb.

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

def render_optional_error_file(status_code)
  known_codes = ["404", "422", "500"]
  status = interpret_status(status_code)

  if known_codes.include?(status) # Here it should be status, not status_code (which is a symbol)
    render :template => "errors/#{status[0,3]}", :status => status, :layout => 'errors' # No need to mention ".html.erb", you can do it, but it is not necessary since rails will guess the correct format.
  else
    render :template => "errors/unknown", :status => status, :layout => 'errors'
  end
end

def local_request?
  # This must return false instead of true so that the public viewer is called 
  # instead of the developer version.
  false 
end
0 голосов
/ 26 июля 2013

Назначение комплектности для новых версий рельсов:

http://www.frick -web.com / ен / блог / nifty_errorpages-камень

это небольшой движок рельсов для обработки ваших страниц с ошибками. Может быть, вам это понадобится для новых проектов. по моему мнению, это хороший вариант для обработки ошибок.

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