Пользовательские ошибочные страницы в направляющих?

Я должен реализовать пользовательскую ошибочную страницу в своем приложении направляющих, которое позволяет мне использовать 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.

22
задан jackyalcine 21 August 2012 в 19:43
поделиться

3 ответа

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

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

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

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

Rails ticket 4444

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

32
ответ дан 29 November 2019 в 05:03
поделиться

Вы, скорее всего, получите ошибку 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
1
ответ дан 29 November 2019 в 05:03
поделиться

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

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

2
ответ дан 29 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: