【问题标题】:rails3 routes issuerails3路线问题
【发布时间】:2010-08-17 13:34:11
【问题描述】:

我有以下路线。

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 => 'pet' 这样的标准模型,那么它可以正常工作。但是,如果我传递一个嵌套模型名称,例如 :klass => 'vehicle/door',那么我会在 rails3 中遇到路线错误。

我猜那是因为我在 value 中有 '/' 。我可以通过使用正则表达式来解决这个问题,但我也可能会传递未嵌套的 :klass。

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

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

另一边的下划线和驼峰化/常量化使得传递嵌套类名更容易。

知道如何为 rails3 修复它吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    停止!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多