Как правильно отрисовать пользовательские 404 и 500 страниц? - PullRequest
1 голос
/ 11 февраля 2012

Есть ли способ сообщить Rails визуализировать ваши пользовательские страницы ошибок (например, те, которые вы пишете в своем ErrorsController)?Я искал много тем, и мне показалось, что одной из них было добавление к ApplicationController что-то вроде

if Rails.env.production?
  rescue_from Exception, :with => :render_error
  rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found
  rescue_from ActionController::UnknownController, :with => :render_not_found
  rescue_from ActionController::UnknownAction, :with => :render_not_found
end

, а затем вы пишете свои методы render_error и render_not_found так, как выхочу.Это кажется мне по-настоящему нелегким решением.Кроме того, это плохо, потому что вы должны точно знать, какие ошибки могут произойти.Это временное решение.

Кроме того, действительно нет простого способа спасти ActionController::RoutingError таким способом.Я видел, что одним из способов было добавить что-то вроде

get "*not_found", :to => "errors#not_found"

к вашему routes.rb.Но что, если вы хотите поднять где-нибудь ActionController::RoutingError вручную?Например, если человек, который не является администратором, попытается «администрировать» контроллеры, угадав URL.В этих ситуациях я предпочитаю поднять значение 404 больше, чем какую-либо ошибку «несанкционированного доступа», потому что это на самом деле говорит человеку, что он угадал URL.Если вы поднимете его вручную, он попытается отобразить 500 страниц, а я хочу 404.

Так есть ли способ сказать Rails: «Во всех случаях вы обычно визуализируете 404.html или500.html, сделать мои пользовательские страницы 404 и 500 "?(Конечно, я удалил страницы 404.html и 500.html из папки public.)

1 Ответ

1 голос
/ 11 февраля 2012

К сожалению, я не знаю методов, которые можно было бы переопределить, чтобы предоставить то, что вы хотите.Вы можете использовать вокруг фильтра.Ваш код будет выглядеть примерно так:

class ApplicationController < ActionController::Base
  around_filter :catch_exceptions

  protected
    def catch_exceptions
      yield
    rescue => exception
      if exception.is_a?(ActiveRecord::RecordNotFound)
        render_page_not_found
      else
        render_error
      end
    end
end

Вы можете обрабатывать каждую ошибку так, как считаете нужным в этом методе.Тогда ваши #render_page_not_found и #render_error методы должны быть такими, как

render :template => 'errors/404'

. Тогда вам понадобится файл на app/views/errors/404.html.[haml|erb]

.
...