2010-11-11 156 views
1

是否有將用戶重定向到特定控制器的解決方案#如果沒有路由匹配,是否有action?我有這樣一個「最後的規則」:如果沒有路由匹配,則Rails路由

match ":rest" => "application#notfound", :constraints => { :rest => /.*/ } 

將所有「其他」的東西重定向到應用程序#notfound。問題是插件與自己的路線設置低於 shis規則,永遠不會被調用。

+0

爲什麼不簡單地編輯public/404.html? – Faisal 2010-11-11 15:04:25

回答

3

你絕對不是唯一有此問題的人。我知道這很令人沮喪,但給它一些時間 - 我相信Rails團隊會把簡單而優雅的東西放在一起。我處於類似的位置,只有我需要知道用戶輸入的URL資源不正確。

快速谷歌搜索,我發現這篇文章演示full solution to the Rails 3.0 rescue_from ActionController::RoutingError problem。該解決方案涉及Route Globbing,並解決了我需要處理不正確的URL和捕獲輸入的URL。希望這可以幫助!

1

把這個規則放在最後..從上到下路由匹配,所以如果它找到了匹配,那麼它就停在那裏。

+0

我把它作爲最後的規則。問題是*插件會在應用程序規則後面添加,所以我必須找到另外一種方法:( – Fu86 2010-11-11 13:51:17

+1

我看到問題出在哪裏,插件應該提供一種方法讓你調用它們的路由,例如devise提供了devise_for路由方法。 – zzawaideh 2010-11-11 14:17:09

1

也許它不是最好的方法,但它會在你的作品沒有找到更好的解決辦法

鋼軌2.3,在應用程序控制器,趕上像

rescue_from(ActionController::RoutingError) { redirect_to "/xpto" #add your code here } 

Rails的例外3

在初始化把這樣的代碼:

module ActionDispatch 
    class ShowExceptions 
    def render_exception(env, exception) 
    if exception.kind_of? ActionController::RoutingError 
     render(500, 'it was routing error') 
    else 
     render(500, "some other error") 
    end 
    end 
end 

或更多的東西乾淨,如:

或:

match '/:anything', :to => "home#routing_error", :constraints => { :anything => /.*/ } 

但也許這最後一場比賽不會對您好,因爲它將覆蓋來自插件/引擎的所有路線。我認爲最好的解決方案是使用定製機架中間件來處理特殊情況。

7

製作一條全路徑並將其作爲您的routes.rb文件中的最後一條規則。

match "*rest" => "application#notfound" 

您還可以在控制器中獲取路徑作爲參數到params[:rest]的任何參數。

+0

爲什麼選擇投票? – edgerunner 2011-02-02 12:29:38

相關問題