Пользовательские страницы ошибок в Rails?

Мне нужно создать страницу пользовательских ошибок в моем приложении 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 ответа

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

Сначала объявите некоторые (обычно я делаю это в 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

Это отображает ошибки /error _404 с макетом ошибок. Если вы начнете:)

И в вашем target_controller:

raise PostNotFound unless @post

Edit

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

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

Rails ticket 4444

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


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

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


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

Update:

Вы уверены, что используете 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


Цель полноты для новых версий рельсов:

http://www.frick-web.com/en/blog/nifty_errorpages-gem

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

licensed under cc by-sa 3.0 with attribution.