2011-04-16 75 views
1

有沒有一種方法來指定route.rb中的條件語句 - 我想root_path取決於用戶是否登錄。也許還有其他的方式來完成這個?ROR 3條件在routes.rb

謝謝!

回答

0

不,你不能那樣做。路線不依賴於基於模型代碼的條件。任何人都可以呼叫一條路線,所以你不能依賴那條路線。

相反,只需在要保護的控制器上添加「before_filter:authenticate」(使用會話)即可。如果有人試圖訪問您的管理員控制器而不是管理員,他們將被重定向到登錄或您喜歡的任何地方。

2

其實我覺得你可以使用高級的約束,它是記錄here ......

你會定義一個def matches?(request)檢查,如果用戶登錄,並使用兩條路線一個有約束時的簽署,一個沒有時。 儘管我不確定在執行該自定義約束時會話是否可用。

儘管我同意SpyrosP,但最好在控制器中執行此操作。

0

我認爲以前的答案(在控制器中建議before_filter更合適)略微缺少OP的用例。將它作爲條件路由/高級約束仍然有優勢。它不會取代控制器中的前置過濾器,以防止未經授權的直接訪問。但是,例如,直接將redirect_to root_path路由到例如用戶在登錄時的個人資料或不在首頁的用戶個人資料,可保留在之前的過濾器中以其他方式丟失的第二次重定向中的閃光消息。更優雅的恕我直言,以使用先進的約束方法(當然假設當測試自定義約束時會話實際上是可用的)。更不用說,在這種類型的實例中,爲什麼不保存額外的重定向(因爲它涉及整個其他HTTP(S)事務)?

更新: 如果您正在使用設計,this文章描述了一個更好的方法。只是自己實現它,它很好,而且很乾淨。

此外,解釋反對票的評論總是值得讚賞的,不僅僅是作者,還有其他閱讀答案的人,因此他們知道爲什麼它可能不是合理的答案。