2010-08-17 200 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一个辅助方法基于通过的模型实例。