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)、アプリケーションコントローラーで指定されたファイルからではなく、標準エラーページ (ERROR 500) を取得します/public/500.html...どうすればそれが可能ですか? 過去数時間、問題を見つけようとしましたが、まだ問題がわかりません。

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 に答える