rails3路线问题

时间:2010-08-17 13:34:11

标签: 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)             
                 {:action=>"show", :controller=>"pota/main"}

以上代码在rails 2.x中运行良好。但是,如果我使用的是rails3,那么我会收到以下错误

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

请注意,我将'车辆/车门'传递给:klass。如果我通过标准模型,例如:klass => '宠物'然后它工作正常。但是,如果我传递一个嵌套的模型名称,如:klass => 'vehicle / door'然后我在rails3中遇到路由错误。

我想这是因为我的值中有'/'。我可以通过使用正则表达式解决这个问题,但我也可以通过:klass,它不是嵌套的。

在像Vehicle :: Car这样的课上我做

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

另一方面,这个下划线和camelize / constantize使得传递嵌套类名更容易。

关于如何修复rails3的任何想法?

1 个答案:

答案 0 :(得分:2)

STOP!

想想你在这里做了什么 - 你不应该在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

然后,您可以添加一个帮助方法,该方法调用相应的命名路由助手,以根据传递的模型实例生成URL。