在讨论使用动态段进行路由时,Ruby on Rails 指南 (v4.0.1) 说“您不能将 :namespace 或 :module 与 :controller 路径段一起使用。”他们继续建议:“如果你需要这样做,那么在 :controller 上使用一个与你需要的命名空间相匹配的约束。”
我在相当多的命名空间下有很多 Controller 。如果我可以让动态段在我的情况下工作,那么我可以用 routes.rb 中的一行来处理所有路由。也许是这样的:
get '/:namespace/:controller/:action' #note: this isn't valid
但这不起作用(见上文)。我宁愿保留命名空间,所以我可以在我的 routes.rb 文件中为每个命名空间写出新的一行,然后添加一个约束来检查 URL 是否要求该命名空间。那不会是世界末日。它看起来如此不干燥和一种耻辱,因为所有路由信息都整齐地显示在 URL 中。
我只是想知道是否有任何偷偷摸摸的方法来解决(对我而言)动态分段路由功能的一些差距。是否可以让路由 DSL 运行一个块(与约束不同)在路由是否匹配上执行比 bool 值是/否更复杂的事情?或者也许我在标准 Rails 路由功能的工作方式中遗漏了一些东西。任何建议表示赞赏。
更新:只是为了更清楚地说明它。我对 Rails 指南的理解是,我需要有这样的行:
post ':controller/:action' , controller: /user_details\/[^\/]+/
post ':controller/:action' , controller: /preferences\/[^\/]+/
...等等。如果我想要 20 个命名空间,那么我需要其中的 20 行。我只是想知道是否没有更简洁的方法来接近我上面给出的 1-line 理想。
最佳答案
如果您想要的是匹配所有路线的动态路线,例如
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
部分也将匹配命名空间 Controller 。已针对 Rails 4.0.1 和 4.2.0 进行验证。
关于ruby-on-rails - Rails 4 路由 : using namespaces with dynamic segments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312954/