我正在使用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需要额外的逻辑,我们需要不同的控制器逻辑,路由等。
答案 0 :(得分:4)
真是没有!!!不要在控制器上实现method_missing!请尽量避免action_missing。
经常被吹捧的模式是添加路线:
map.connect '*', :controller => 'error', :action => 'not_found'
您可以在哪里显示相应的错误。
Rails还有一个名为rescue_action_in_public的机制,您可以在其中编写自己的错误处理逻辑 - 我们真的应该清理它并鼓励人们使用它。 PDI! : - )
答案 1 :(得分:1)
有method_missing方法。您可以在应用程序控制器中实现该操作并捕获所有缺少的操作,可能会记录这些操作并重定向到相关控制器的索引操作。这种方法会忽略无法路由到控制器的所有内容,这与您想要的非常接近。
或者,我只记录所有错误,提取网址并按照发生的次数对其进行排序。