【问题标题】:Rails 4 routing: using namespaces with dynamic segmentsRails 4 路由:使用具有动态段的命名空间
【发布时间】:2013-12-01 14:05:12
【问题描述】:

在讨论使用动态段进行路由时,Ruby on Rails 指南 (v4.0.1) 说“您不能将 :namespace 或 :module 与 :controller 路径段一起使用。”他们继续说建议:“如果您需要这样做,请在 :controller 上使用与您需要的命名空间相匹配的约束。”

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

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

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

我只是想知道是否有什么鬼鬼祟祟的方法可以绕过(在我看来)动态分段路由功能的一些差距。是否可以让路由 DSL 运行一个块(与约束不同)在路由是否匹配时执行比布尔值是/否更复杂的事情?或者也许我在标准 Rails 路由功能的工作方式上遗漏了一些东西。任何建议表示赞赏。

更新:只是为了更详细地说明它。我对 Rails 指南的理解是我需要有这样的行:

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

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

【问题讨论】:

  • 所以您要“干燥”您的 routes.rb 文件?
  • 添加更新只是为了解释一下我的“干燥”目标是什么,假设它是可能的。

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


【解决方案1】:

如果您想要的是匹配所有路由的动态路由,例如

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 验证。

【讨论】:

  • 请注意:如果您使用动态路由,请确保您不会意外暴露控制器的非操作方法。请注意,控制器中的每个公共方法都将被解释为操作方法!将任何辅助方法声明为private
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多