Динамические страницы ошибок Rails (404, 422, 500) отображаются пустыми

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

В config/application.rb Я добавил строку config.exceptions_app = self.routes для учета этого.

Затем я добавил следующее в мои маршруты:

get "/not-found", :to => "errors#not_found"
get "/unacceptable", :to => "errors#unacceptable"
get "/internal-error", :to => "errors#internal_error"

И контроллер ошибок выглядит так:

class ErrorsController < ApplicationController
  layout 'errors'
  def not_found
    render :status => 404
  end

  def unacceptable
    render :status => 422
  end

  def internal_error
    render :status => 500
  end
end

Собираюсь /not-found показывает шаблон в том виде, в каком он должен быть, хотя при посещении любого несуществующего URL (т.е. /i-dont-exist) отображается пустая страница.

Единственная причина, по которой я это вижу, заключается в том, что для обработки исключений нужны, например, маршруты get "/404", :to => "errors#not_found"хотя, по иронии судьбы, он не находит маршрут для /404 (и нет, это не просто работает:)).

Любой совет, высоко ценится. Спасибо, Стив.

2 ответа

Решение

Кажется, некоторые настройки неверны. Попробуйте это в ваших маршрутах:

match '/404', to: 'errors#not_found', via: :all (совпадать, а не получить)

Вы упоминаете, что в application.rb у тебя есть config.exceptions_app = self.routes, это хорошо. Но убедитесь, что вы перезагружаете сервер перед тестированием ваших изменений.

И убедитесь, что ваши файлы представлений ошибок имеют то же имя, что и действия в вашем ErrorsController,

Если вы получаете какую-либо ошибку (ха-ха) в консоли, не могли бы вы опубликовать ее?

Сделайте это вместо этого:

routes.rb

%w(404 422 500).each do |code|
  get code, :to => "errors#show", :code => code
end

errors_controller.rb

class ErrorsController < ApplicationController
  def show
    render status_code.to_s, :status => status_code
  end

  protected
  def status_code
    params[:code] || 500
  end
end

внутри вашего config/application.rb убедитесь, что у вас есть:

module YourWebsite
  class Application < Rails::Application

    config.exceptions_app = self.routes
    # .. more code ..
  end
end

Тогда вам, очевидно, понадобятся представления;) Не забудьте также удалить страницы ошибок в вашем публичном каталоге.

Другие вопросы по тегам