2008-09-09 21 views
2

私はRails 2.1のrouting.rbコードを試していて、適切なパスが見つからない場合にスローされるRoutingError例外を使って何か役に立つことができるようにしています。Rails 2.1.xでRoutingErrorを処理する最善の方法は?

これはやや難しい問題です。いくつかのクラスのURLがあります:Bazの/azenv.phpボット攻撃、/ bar/foo/bazのURLへの入力などです。それを望んでいない。

次に、/ artists// ///など通知が必要な微妙なルーティングの問題があります。このような状況では、エラーが発生する可能性があります。そうでない場合は、Googleが有効であったが削除されたURLは送信されます。

これらの状況では、私が戻ってきたパス、あるいは通常の「フォールバックキャッチオール」URLを過ぎたルーティングを管理するためのRailsyの方法を含む、分析し、フィルタリングする方法が必要です。これは存在しますか?

EDIT:

だからここのコードは次のとおりです。

# 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(例外)をオーバーライドすることです。我々はなど別のコントローラロジック、ルートを、したい追加のロジックのためだから、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 

で塩

答えて

1

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

また、すべてのエラーをログに記録し、URLを抽出し、発生した回数だけソートするだけです。

+0

method_missingを使用すると、いくつかの問題が発生する可能性があります。 1つは、セキュリティに使用されている誤ってラベル付けされたbefore_filterがある場合、method_missingは呼び出しを静かにキャプチャし、ログにルーティングエラーが発生し、誰かが管理ページを表示できなくなったときに表示できます。 – epochwolf

4

Nooooo !!!あなたのコントローラにmethod_missingを実装しないでください!また、action_missingも避けてください。あなたは適切なエラーを表示することができます

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

頻繁にもてはやさパターンは、ルートを追加することです。

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

+0

問題はrescue_action_in_publicエラーのロギングを妨げないことである - コードは行く: 141:DEF rescue_action_without_handler(例外) 142:LOG_ERROR(例外)ロガー なら... 151:consider_all_requests_local ||もしlocal_request? 152:rescue_action_locally(例外) 153:else 154:rescue_action_in_public(例外) 155:end 156:end –

関連する問題