2010-08-17 197 views
0

我有以下路由。rails3路由問題

pota.resources :on_k, 
       :as => ':klass', 
       :path_prefix => 'pota/klass', 
       :controller => 'main' 

當我做耙路線,這是我所得到的顯示方法:

pota_on_k GET /pota/klass/:klass/:id(.:format)    
       {:action=>"show", :controller=>"pota/main"} 

上面的代碼工作中軌2.X罰款。但是,如果我使用rails3,然後我得到以下錯誤

ActionController::RoutingError: No route matches 
{:action=>"show", :controller=>"pota/main", :klass=>"vehicle/door", :id=>1} 

請注意,我通過'車輛/門'爲:克拉斯。如果我傳遞一個標準模型,如:klass =>'pet',那麼它工作正常。但是,如果我傳遞一個嵌套的模型名稱,如:klass =>'vehicle/door',那麼我會在rails3中得到路由錯誤。

我想這是因爲我在值中有'/'。我可以通過一個正則表達式來解決這個問題,但我也可以通過:klass,它不是嵌套的。

在樣車::汽車類我做

Vehicle::Car.underscore #=> vehicle/car 
"vehicle/car".camelize.constantize #=> Vehicle::Car 

這下劃線和camelize/constantize對對方可以更容易地通過嵌套類的名稱。

任何想法如何去解決它的rails3?

回答

2

停止!

想想你在做什麼 - 你不應該在url參數上調用constantize。假設你可能會調用查找結果,你基本上給黑客一種查詢應用程序中每個ActiveRecord模型的方法。

更好的方法是使用元編程來動態地建立不能被黑客攻破靜態路由,例如:

%w[pet vehicle/car vehicle/bike].each do |klass| 
    resources :pota, 
     :path => "pota/#{klass.pluralize}", 
     :as => "pota_#{klass.tr('/','_').pluralize}", 
     :defaults => { :klass => klass } 
    end 

然後你就可以添加調用適當命名的路由助手生成URL一個輔助方法基於通過的模型實例。