0

私の application_controller.rb コードは次のとおりです。

class ApplicationController < ActionController::Base# Prevent CSRF attacks by raising an exception.#For APIs, you may want to use: null_session instead.
  protect_from_forgery
  before_filter: set_current_user
  rescue_from ActionController::RoutingError, with: : render_error

  def render_error
    p "**************************************"
  end

  def set_current_user
    User.current_user = current_user
  end

 end

ここでヒットしようとすると、home/xyzこの例外はキャプチャされているはずですが、制御がrender_errorメソッドに来ることはありません。この例外を捕捉するために私がしなければならないことは他にありますか? または、Rails 4.2で利用できるより良い方法がある場合、誰かが私がGemを試したことについて私を案内してくれますException Notificaitonが、それもうまくいかないようです. 注:開発環境を使用しています。

私のエラーログ:

Started GET "/qweq"
for 172.24.106.197 at 2016 - 09 - 07 16: 03: 01 + 0530

ActionController::RoutingError(No route matches[GET]
    "/qweq"):
  actionpack(4.2.6) lib / action_dispatch / middleware / debug_exceptions.rb: 21: in `call'
  actionpack (4.2.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `
call '
  railties (4.2.6) lib/rails/rack/logger.rb:38:in `call_app'
railties(4.2.6) lib / rails / rack / logger.rb: 20: in `block in call'
  activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `
block in tagged '
  activesupport (4.2.6) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport(4.2.6) lib / active_support / tagged_logging.rb: 68: in `tagged'
  railties (4.2.6) lib/rails/rack/logger.rb:20:in `
call '
  actionpack (4.2.6) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack(1.6.4) lib / rack / methodoverride.rb: 22: in `call'
  rack (1.6.4) lib/rack/runtime.rb:18:in `
call '
  activesupport (4.2.6) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack(1.6.4) lib / rack / lock.rb: 17: in `call'
  actionpack (4.2.6) lib/action_dispatch/middleware/static.rb:120:in `
call '
  rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
railties(4.2.6) lib / rails / engine.rb: 518: in `call'
  railties (4.2.6) lib/rails/application.rb:165:in `
call '
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
rack(1.6.4) lib / rack / content_length.rb: 15: in `call'
  rack (1.6.4) lib/rack/handler/webrick.rb:88:in `
service '
  /home/883562/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service' / home / 883562 / .rvm / rubies / ruby - 2.1.4 / lib / ruby / 2.1.0 / webrick / httpserver.rb: 94: in `run'
  /home/883562/.rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/webrick/server.rb:295:in `
block in start_thread '
4

2 に答える 2

2

そのコードでルーティング エラーを処理できない理由は、コントローラーがインスタンス化される前にルートが解決されるためです。解決されない場合 (一致するコントローラー/アクションが見つからない場合)、ルーター自体がこのエラーを発生させます。当然、アプリケーション コントローラーはそれを認識しません。

あなたができることは、コントローラー/アクションにマップされ、そのアクションで追跡を行う「キャッチオール」ルートを定義することです(またはあなたがやりたいことは何でも)。

于 2016-09-07T11:46:57.730 に答える
0

config/application.rb

module NameOfYourApp
  class Application < Rails::Application
    require Rails.root.join("lib/custom_public_exceptions")
    config.exceptions_app = CustomPublicExceptions.new(Rails.public_path)
  end
end

config/routes.rb

match "/404" => "errors#error404", via: [ :get, :post, :patch, :delete ]

lib/custom_public_exceptions.rb

class CustomPublicExceptions < ActionDispatch::PublicExceptions
  def call(env)
    status = env["PATH_INFO"][1..-1]

    if status == "404"
      Rails.application.routes.call(env)
    else
      super
    end
  end
end

アプリ/コントローラー/errors_controller.rb

class ErrorsController < ApplicationController
  def error404
    render status: :not_found
  end
end

アプリ/ビュー/エラー/error404.er

  <span> 404 </span>
  <p>Page Not Found<p>

を使用して、ErrorsControllerさまざまなエラーを処理し、対応するビュー テンプレートをカスタマイズして、見栄えの良いエラー ページを提供できます。

于 2016-09-07T11:23:44.613 に答える