我正在玩Rails 2.1中的routing.rb代碼,並試圖讓它能夠對路徑錯誤異常進行一些有用的操作,當它找不到適當的路徑時會引發這個異常。在Rails 2.1.x中處理RoutingError的最佳方法是什麼?
這是一個有點棘手的問題,因爲有一些URL只是普通的BAD:/azenv.php機器人攻擊,人們在URL中輸入/ bar/foo/baz等等......我們不要那樣。
然後有微妙的路由問題,我們希望得到通知:藝術家/例如,或/ /。在這些情況下,我們可能希望發生錯誤,或者不會......或者我們讓Google向我們發送過去是有效的網址,但不再是因爲人們刪除了這些網址。
在上述每種情況下,我想要一種方法來包含,分析和過濾我們找回的路徑,或者至少有一些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(例外),這樣我們就可以根據異常過濾器的例外情況。因此,在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可能會導致一些問題。首先,如果有一個錯誤標記的用於安全性的before_filter,method_missing將默默捕獲該調用,並且最終會在日誌中出現路由錯誤,並且有人可以在他們無法訪問時查看管理頁面。 – epochwolf 2008-09-18 16:13:03