2

我正在使用 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

在我们需要不同的控制器逻辑、路由等的地方添加额外的逻辑。

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 回答