Ruby on rails 铁路3路线问题
我有以下路线Ruby on rails 铁路3路线问题,ruby-on-rails,Ruby On Rails,我有以下路线 pota.resources :on_k, :as => ':klass', :path_prefix => 'pota/klass', :controller => 'main' 当我做rake路由时,这是我通过show方法得到的结果: pota_on_k GET /pota/klass/:klass/:id(.:format)
pota.resources :on_k,
:as => ':klass',
:path_prefix => 'pota/klass',
:controller => 'main'
当我做rake路由时,这是我通过show方法得到的结果:
pota_on_k GET /pota/klass/:klass/:id(.:format)
{:action=>"show", :controller=>"pota/main"}
上述代码在Rails2.x中运行良好。但是,如果我使用的是rails3,则会出现以下错误
ActionController::RoutingError: No route matches
{:action=>"show", :controller=>"pota/main", :klass=>"vehicle/door", :id=>1}
请注意,我通过的“车辆/门”为:klass。如果我通过了一个标准模型,比如:klass=>“pet”,那么它就可以正常工作。然而,如果我传递一个嵌套的模型名,比如:klass=>“vehicle/door”,那么我会在rails3中得到路由错误
我想这是因为我在值中有“/”。我可以通过一个正则表达式来解决这个问题,但我也可以通过:klass,它不是嵌套的
在像Vehicle::Car这样的课堂上,我喜欢
Vehicle::Car.underscore #=> vehicle/car
"vehicle/car".camelize.constantize #=> Vehicle::Car
另一侧的下划线和camelize/constantize使传递嵌套类名更容易
有没有关于如何为rails3修好它的想法?停下来
想想你在这里做什么-你不应该在url参数上调用constantize。假设您可能会对结果调用find,那么您基本上是在为黑客提供一种查询应用程序中每个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
然后,您可以添加一个helper方法,该方法调用相应的命名路由helper,以基于传递的模型实例生成URL