0

我正在将应用程序从 Rails 2 迁移到 Rails 3。
我们有多个具有不同命名空间的命名空间控制器。由于它们不是 RESTfull 我不想使用资源路由,而是我想要一个旧的 Rails 2,比如match ':controller/:action'来获取命名空间的控制器。

在我的 routes.rb 我有

# Install the default route as the lowest priority.
match ':controller(/:action(/:id(.:format)))'
match ':controller(/:action(/:id(.:format)))', :controller => /[^\/]+\/[^\/]+/

rake 路由报告

/:controller(/:action(/:id(.:format)))          :controller#:action
/:controller(/:action(/:id(.:format)))          (?-mix:[^\/]+\/[^\/]+)#:action

对/config/companies/index的请求仍然失败

ActionController::RoutingError (No route matches [GET] "/config/companies/index"):

我究竟做错了什么?是否有另一种方法来获取具有动态段的命名空间路由?当我尝试同时使用命名空间和与动态段的匹配时,它会引发错误。

:controller segment is not allowed within a namespace block
4

1 回答 1

0

好的,我发现了问题。
Config 是 Rails 中的一个保留常量,它指向 RbConfig。我的匹配条件实际上有效,但尝试调用 RbConfig::CompaniesController 当然不存在。

当我尝试添加

match '/:controller(/:action(/:id(.:format)))', :controller => /config\/[^\/]+/

错误是

ActionController::RoutingError (uninitialized constant RbConfig::CompaniesController)

解决方案:重命名 app/controllers/config -> app/controllers/configuration(和 views 文件夹)并添加重定向到路由以处理旧链接。

match '/config/*path' => redirect("/configuration/%{path}")
于 2013-01-04T01:35:56.967 回答