我正在使用 Rails 2.1 中的 routing.rb 代码,并试图让它达到我可以对找不到适当路径时抛出的 RoutingError 异常做一些有用的事情的地步。
这是一个有点棘手的问题,因为有些类型的 URL 只是简单的 BAD:/azenv.php 机器人攻击,在 URL 中键入 /bar/foo/baz 的人,等等......我们不想要那。
然后是微妙的路由问题,我们确实希望收到通知:例如 /artists/ 或 ///。在这些情况下,我们可能希望或不抛出错误......或者我们让 Google 向我们发送过去有效但不再是因为人们删除它们的 URL。
在每种情况下,我都想要一种方法来包含、分析和过滤我们返回的路径,或者至少是某种 Railsy 方法来管理通过正常的“fallback catchall”url 的路由。这存在吗?
编辑:
所以这里的代码是:
# 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
在我们需要不同的控制器逻辑、路由等的地方添加额外的逻辑。