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

时间:2008-09-09 04:08:54

标签: ruby-on-rails ruby routing

我正在使用Rails 2.1中的routing.rb代码,并尝试将其运行到可以使用在找不到合适路径时抛出的RoutingError异常的有用的东西。< / p>

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

然后有一些微妙的路由问题,我们希望收到通知:/ artists /例如,或///。在这些情况下,我们可能会想要抛出错误,或者不会......或者我们会让Google向我们发送过去有效但不再因为人们删除它们的网址。

在每种情况下,我想要一种方法来包含,分析和过滤我们得到的路径,或者至少一些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(异常),以便我们可以根据异常过滤掉异常。所以在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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

您可以在哪里显示相应的错误。

Rails还有一个名为rescue_action_in_public的机制,您可以在其中编写自己的错误处理逻辑 - 我们真的应该清理它并鼓励人们使用它。 PDI! : - )

答案 1 :(得分:1)

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

或者,我只记录所有错误,提取网址并按照发生的次数对其进行排序。