我不知道如何驗證一個slug(來自用戶輸入)與除硬編碼以外的控制器的所有方法名稱(不一定是self
中的那些),所以說tag/tomato
是有效的,但/tag/all
不是,因爲有一個all
控制器中的方法Tag
?使用反射?驗證Ruby on Rails中的slu Exc時排除方法名稱?
還是有更好的做法?
我不知道如何驗證一個slug(來自用戶輸入)與除硬編碼以外的控制器的所有方法名稱(不一定是self
中的那些),所以說tag/tomato
是有效的,但/tag/all
不是,因爲有一個all
控制器中的方法Tag
?使用反射?驗證Ruby on Rails中的slu Exc時排除方法名稱?
還是有更好的做法?
你可以在你的控制器這樣定義的方法列表:
TagController.instance_methods(false)
注意,通過傳遞false
作爲參數傳遞給instance_methods
,你得到的是不繼承方法的列表。
聽起來像你真的想防止路由衝突,並且只是鬆散地連接到控制器中的方法名稱。
您可以從
Rails.application.routes.routes
這讓你ActionDispatch::Routing::Route
實例數組在運行時獲取的所有路由。然後,獲得GET路線:
gettable = Rails.application.routes.routes.select do |r|
r.verb == 'GET' || r.verb == '' # Watch out for "no verb" -> "all verbs"
end
,並從那裏,你可以提取路徑和檢查標籤不符合其中任何一個:
paths = Rails.application.routes.routes.
select { |r| r.verb == 'GET' || r.verb == '' }.
map { |r| r.path }
這使得你的列表/this/:that(.:format)
樣式路徑paths
。
一旦所有這些都到位,您需要應用程序初始值設定程序來檢查您是否沒有添加任何路由到/tag/
名稱空間,該名稱空間碰巧與標記數據庫的當前狀態匹配;否則,衝突會在開發過程中蔓延。
這應該讓你相信,你最好保留創建,查看等方面的正常路線,使其與人類/搜索引擎優化友好的/tag/pancakes
路線分開。你可以離開通常的/tag
,但把友好的移動到/taxonomy/
,/category/
,或類似的東西。