2011-10-24 30 views
1

我不知道如何驗證一個slug(來自用戶輸入)與除硬編碼以外的控制器的所有方法名稱(不一定是self中的那些),所以說tag/tomato是有效的,但/tag/all不是,因爲有一個all控制器中的方法Tag?使用反射?驗證Ruby on Rails中的slu Exc時排除方法名稱?

還是有更好的做法?

回答

1

你可以在你的控制器這樣定義的方法列表:

TagController.instance_methods(false) 

注意,通過傳遞false作爲參數傳遞給instance_methods,你得到的是繼承方法的列表。

2

聽起來像你真的想防止路由衝突,並且只是鬆散地連接到控制器中的方法名稱。

您可以從

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/,或類似的東西。