在讨论使用动态段的路由时,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线理想。
答案 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。