Я должен реализовать пользовательскую ошибочную страницу в своем приложении направляющих, которое позволяет мне использовать erb.
Я следовал этому учебному руководству (http://blog.tommilewski.net/2009/05/custom-error-pages-in-rails/), и я не могу заставить его работать локально (или удаленно). Я выполняю направляющие 2.3.5
Вот суть подхода.
1) в 'application_controller', мне по поездке "render_optional_error_file (status_code)" метод и набор видимость к "защищенному", как это.
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
, Я, кажется, получаю стандартные апачские 500 ошибок. Это происходит, когда я пробую обоих mongrel_rails start
и mongrel_rails start -e production
.
Я бы предложил использовать исключения для отображения таких страниц с ошибками, чтобы вы могли использовать наследование для группировки сообщений об ошибках ...
Во-первых, объявите некоторые ( Обычно я делаю это в 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 / error_404 с макетом ошибок. Для начала:)
И в вашем target_controller:
raise PostNotFound unless @post
Edit
для более подробного объяснения того, почему ActionController :: RoutingError не работает для rails 3: {{1} } Обработка исключений Rails 3.0 .
«Если ваше приложение использует движки, которые расширяют ваше приложение своими собственными маршрутами, все выйдет из строя, потому что эти маршруты никогда не будут запущены !»
Вы, скорее всего, получите ошибку 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
Во-первых, удалили ли вы файл: 'public / 500.html'. Если этот файл существует, он переопределит все, что вы пытаетесь сделать.
Во-вторых, использование явного «rescue_from» в контроллере (как объяснено в другом комментарии) - хороший вариант, если вам нужно точно настроить реакцию на различные типы ошибок.