在Rails 2.1.x中处理RoutingError的最佳方法是什么?

我正在使用Rails 2.1中的routing.rb代码,并尝试将其设置为可以使用在找不到合适路径时抛出的RoutingErrorexception。

这是一个有点棘手的问题,因为有一些类别的URL只是简单的BAD:/ azenv.php机器人攻击,人们在URL中键入/ bar / foo / baz等等…我们不想要那。

然后是微妙的路由问题,我们确实希望得到通知:/ artists /例如,或///。 在这些情况下,我们可能会想要抛出错误,或者不是……或者我们让Google向我们发送曾经有效但不再因为人们删除它们的url。

在每种情况下,我想要一种方法来包含,分析和过滤我们得到的路径,或者至少有一些Railsy方法来管理路由超过正常的’后备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),以便我们可以根据exception过滤掉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 

盐需要额外的逻辑,我们需要不同的控制器逻辑,路由等。

真是没有! 不要在控制器上实现method_missing! 请尽量避免action_missing。

经常被吹捧的模式是添加路线:

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

你可以在哪里显示适当的错误。

Rails还有一个名为rescue_action_in_public的机制,你可以编写自己的error handling逻辑 – 我们真的应该清理它并鼓励人们使用它。 PDI! 🙂

有method_missing方法。 您可以在应用程序控制器中实现该操作并捕获所有缺少的操作,可能会记录这些操作并重定向到相关控制器的索引操作。 这种方法会忽略无法路由到控制器的所有内容,这与您想要的非常接近。

或者,我只记录所有错误,提取URL并按其出现的次数对其进行排序。