Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 铁路3路线问题_Ruby On Rails - Fatal编程技术网

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