3

我使用exception_notification gem 来处理应用程序中的错误。我的ApplicationController看起来像这样:

unless Rails.application.config.consider_all_requests_local
    rescue_from Exception,
                :with => :render_error
    rescue_from ActiveRecord::RecordNotFound,
                :with => :render_not_found
    rescue_from ActionController::RoutingError,
                :with => :render_not_found
    rescue_from ActionController::UnknownController,
                :with => :render_not_found
    rescue_from ActionController::UnknownAction,
                :with => :render_not_found
  end

  def render_not_found(exception)
    ExceptionNotifier::Notifier
      .exception_notification(request.env, exception)
      .deliver
    render :template => "/errors/404.html.erb",
      :layout => 'errors.html.erb'
    return     
  end

  def render_error(exception)
    ExceptionNotifier::Notifier
      .exception_notification(request.env, exception)
      .deliver
    render :template => "/errors/500.html.erb",
           :layout => 'errors.html.erb'
    return
  end

在文件末尾的/config/enviroments/productions.rg中,我有:

config.middleware.use ExceptionNotifier,
  :email_prefix => "[MY APP| Error Report] ",
  :sender_address => %{"MY APP" <err@my-app.com>},
  :exception_recipients => 'my_email@gmail.com'
end

当我在应用程序上收到错误时 - 例如。Article.find(not-existing-ID),我将从/public/500.html应用程序控制器中指定的文件而不是从应用程序控制器中指定的文件中获取标准错误页面(ERROR 500)...这怎么可能?过去几个小时我试图找到问题,但我仍然不知道问题所在。

4

2 回答 2

3

这对我有用 - 来自 application_controller.rb:

unless Rails.application.config.consider_all_requests_local
  rescue_from Exception, with: :render_500
  rescue_from ActionController::RoutingError, with: :render_404
  rescue_from ActionController::UnknownController, with: :render_404
  rescue_from ActionController::UnknownAction, with: :render_404
  rescue_from ActiveRecord::RecordNotFound, with: :render_404
end

  private
  def render_404(exception)
    ExceptionNotifier::Notifier.exception_notification(request.env, exception,
      :data => {:User => current_user.full_name, :Email => current_user.email, :UserID => current_user.id}).deliver
    @not_found_path = exception.message
    respond_to do |format|
      format.html { render template: 'pages/404', layout: 'layouts/application', status: 404 }
      format.all { render nothing: true, status: 404}
    end
  end
  def render_500(exception)
    ExceptionNotifier::Notifier.exception_notification(request.env, exception,
      :data => {:User => current_user.full_name, :Email => current_user.email, :UserID => current_user.id}).deliver
    @error = exception
    respond_to do |format|
      format.html { render template: 'pages/500', layout: 'layouts/application', status: 500 }
      format.all { render nothing: true, status: 500}
    end
  end

注意:我在 /app/views/pages 中有我的自定义错误页面。称为 500.html.haml 和 404.html.haml

我的 routes.rb 中也有这个(注意 'pages 后面的哈希而不是正斜杠):

  unless Rails.application.config.consider_all_requests_local
    match '*not_found', to: 'pages#404'
  end

PS。在此处查看更新说明:http ://ramblinglabs.com/blog/2012/01/rails-3-1-adding-custom-404-and-500-error-pages

于 2012-08-09T13:07:50.660 回答
0

嗨,这对我有用,试试吧!

在 application_controller.rb 中,您可以添加以下代码:

 if Rails.env.production?
  unless Rails.application.config.consider_all_requests_local
    rescue_from Exception, with: :render_500
    rescue_from ActionController::RoutingError, with: :render_404
    rescue_from ActionController::UnknownController, with: :render_404
    rescue_from ActionController::UnknownAction, with: :render_404
    rescue_from ActiveRecord::RecordNotFound, with: :render_404
  end
 end

此代码检查您是否使用生产模式运行您的 Rails 应用程序并捕获不同的救援错误。

在同一控制器“application_controller.rb”中添加以下代码:

def render_404(exception)
    @not_found_path = exception.message
    respond_to do |format|
      format.html { render template: 'errors/not_found', layout: 'layouts/application', status: 404 }
      format.all { render nothing: true, status: 404 }
    end
  end

  def render_500(exception)
    logger.info exception.backtrace.join("\n")
    respond_to do |format|
      format.html { render template: 'errors/internal_server_error', layout:      'layouts/application', status: 500 }
      format.all { render nothing: true, status: 500}
    end
  end

这些方法将指定您的应用程序捕获错误时要显示的页面,然后创建一个名为:errors_controller.rb 的控制器,然后在您的app/view/errors 中 创建一个名为:

  • internal_server_error.html.erb 和
  • not_found.html.erb

并在您的routes.rb中 添加以下代码:

 match '/internal_server_error', :to => 'errors#internal_server_error'
 match '/not_found', :to => 'errors#not_found'
于 2013-04-23T04:18:17.387 回答