Rails 4路由:使用带动态段的命名空间

时间:2013-12-01 14:05:12

标签: ruby-on-rails ruby-on-rails-4 rails-routing

在讨论使用动态段的路由时,Ruby on Rails指南(v4.0.1)说“你不能使用:namespace或:module with a:controller path segment。”他们继续建议:“如果你需要这样做,那么使用一个约束:控制器匹配你需要的命名空间。”

我在很多命名空间下有很多控制器。如果我可以在我的情况下使动态段工作,那么我可以使用routes.rb中的一行处理所有路由。也许是这样的:

get '/:namespace/:controller/:action'             #note: this isn't valid

但这不起作用(见上文)。我宁愿保留命名空间,所以我可以在我的 routes.rb 文件中为每个命名空间写一个新行,然后添加一个约束来检查URL是否要求该命名空间。这不会是世界末日。它看起来非常干燥和耻辱,因为所有的路由信息​​都巧妙地呈现在URL中。

我只是想知道是否有任何偷偷摸摸的方式似乎(对我来说)像动态段路由功能的一点差距。是否可以让路由DSL运行一个块(与Constraints不同)执行比路由匹配的布尔值yes / no更复杂的块?或许我遗漏了标准Rails路由功能的工作方式。任何建议表示赞赏。

更新:只是拼出一点点。我对Rails指南的理解是,我需要有这样的行:

post ':controller/:action' , controller: /user_details\/[^\/]+/
post ':controller/:action' , controller: /preferences\/[^\/]+/

......等等。如果我想要20个名称空间,那么我将需要20个这样的行。我只是想知道是否有一种更简洁的方式接近上面给出的我的1线理想。

1 个答案:

答案 0 :(得分:0)

如果你想要的是一条匹配所有路线的动态路线,比如

post 'user_details/name/edit'     => 'user_details/name#edit'
post 'user_details/address/edit'  => 'user_details/address#edit'
post 'user_details/password/edit' => 'user_details/password#edit'
post 'preferences/privacy/edit'   => 'preferences/privacy#edit'
post 'preferences/colors/edit'    => 'preferences/colors#edit'

然后你可以使用

post ':controller/:action'

因为:controller部分也会匹配命名空间控制器。

验证了Rails 4.0.1和4.2.0。