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

时间:2020-03-05 18:49:50  来源:igfitidea点击:

我正在使用Rails 2.1中的routing.rb代码,并试图将其处理到可以在找不到合适路径时引发的RoutingError异常的地方做些有用的事情。

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

然后是一个细微的路由问题,我们确实希望收到通知:例如/ artists /或者///。在这些情况下,我们可能希望抛出一个错误,或者不希望出现错误……或者我们让Google向我们发送了曾经有效但不再因为人们删除了它们而不再使用的URL。

在以上每种情况下,我都希望有一种方法来包含,分析和过滤返回的路径,或者至少要有一种Railsy的方法来管理通过常规"后备捕获" 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

在需要其他控制器逻辑,路由等的情况下添加其他逻辑。

解决方案

回答

有method_missing方法。我们可以在Application Controller中实现该功能,并捕获所有丢失的操作,例如记录这些丢失的操作并重定向到相关控制器的index操作。这种方法会忽略所有无法路由到控制器的东西,这与我们想要的东西非常接近。

另外,我只记录所有错误,提取URL并按发生的时间对其进行排序。

回答

不!!!不要在控制器上实现method_missing!并且请尽量避免action_missing。

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

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

我们可以在其中显示适当的错误的地方。

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