2008-09-09 145 views
2

我正在玩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 

鹽的地方,我們希望不同的控制器邏輯,路線附加邏輯等

回答

1

還有的method_missing的方法。您可以在您的應用程序控制器中實現該功能,並捕獲所有缺失的操作,可能會記錄這些操作並重定向到相關控制器的索引操作。這種方法會忽略所有無法路由到控制器的東西,這與您想要的非常接近。

另外,我只是記錄所有的錯誤,提取網址,並按它發生的次數排序。

+0

使用method_missing可能會導致一些問題。首先,如果有一個錯誤標記的用於安全性的before_filter,method_missing將默默捕獲該調用,並且最終會在日誌中出現路由錯誤,並且有人可以在他們無法訪問時查看管理頁面。 – epochwolf 2008-09-18 16:13:03

4

Nooooo !!!不要在你的控制器上實現method_missing!並且請儘量避免action_missing。

經常吹捧模式添加路由:

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

在那裏你可以顯示相應的錯誤。

Rails還有一個名爲rescue_action_in_public的機制,您可以在其中編寫自己的錯誤處理邏輯 - 我們應該清理它並鼓勵用戶使用它。 PDI! :-)

+0

問題是rescue_action_in_public方法並不能阻止錯誤的日誌 - 代碼有云: 141:高清rescue_action_without_handler(例外) 142:的log_error(異常)如果記錄 ... 151:如果consider_all_requests_local || local_request? 152:rescue_action_locally(例外) 153:else 154:rescue_action_in_public(例外) 155:結束 156:結束 – 2009-07-09 02:06:43

相關問題