2

私はRails 2.1のrouting.rbコードで遊んでいて、適切なパスが見つからない場合にスローされるRoutingError例外で何か役に立つことができるところまで到達しようとしています。

/azenv.php ボット攻撃、URL に /bar/foo/baz を入力する人など、単純に悪い URL のクラスがあるため、これはややトリッキーな問題です。それ。

次に、微妙なルーティングの問題があります。たとえば、/artists/ や /// など、通知を受け取りたい場所です。このような状況では、エラーをスローしたい場合と、スローしたくない場合があります... または、以前は有効だったが削除されたために無効になった URL を Google から送信してもらうことがあります。

これらの状況のそれぞれで、返されるパスを格納、分析、フィルタリングする方法、または少なくとも通常の「フォールバック キャッチオール」URL を通過するルーティングを管理する Railsy の方法が必要です。これは存在しますか?

編集:

したがって、ここのコードは次のとおりです。

# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 141

def rescue_action_without_handler(exception)
 log_error(exception) if logger
 erase_results if performed?

 # Let the exception alter the response if it wants.
 # For example, MethodNotAllowed sets the Allow header.
 if exception.respond_to?(:handle_response!)
   exception.handle_response!(response)
 end

 if consider_all_requests_local || local_request?
   rescue_action_locally(exception)
 else
  rescue_action_in_public(exception)
 end
end

したがって、最良のオプションは、例外に従って例外をフィルタリングできるように、log_error(exception) をオーバーライドすることです。だからApplicationControllerで

def log_error(exception)
    message = '...'
    if should_log_exception_as_debug?(exception)
      logger.debug(message)
    else
      logger.error(message)
    end
end

def should_log_exception_as_debug?(exception)
   return (ActionController::RoutingError === exception)
end

別のコントローラーロジック、ルートなどが必要な追加ロジックのソルト。

4

2 に答える 2

4

いやぁぁぁぁ!!!コントローラーに method_missing を実装しないでください! また、action_missing も避けるようにしてください。

よく宣伝されるパターンは、ルートを追加することです。

map.connect '*', :controller => 'error', :action => 'not_found'

適切なエラーを表示できる場所。

Rails には、rescue_action_in_public という独自のエラー処理ロジックを記述できるメカニズムもあります。これをクリーンアップして、人々に使用してもらう必要があります。PDI!:-)

于 2008-09-16T12:11:19.327 に答える
1

method_missing メソッドがあります。アプリケーションコントローラーでそれを実装し、不足しているすべてのアクションをキャッチし、それらをログに記録して、関連するコントローラーのインデックスアクションにリダイレクトすることができます。このアプローチでは、コントローラーにルーティングできないものはすべて無視されます。これは、必要なものにかなり近いものです。

または、すべてのエラーをログに記録し、URL を抽出して、発生回数で並べ替えます。

于 2008-09-09T08:14:53.090 に答える