【问题标题】:Rails Routing: Need to add an optional :user_id to route for user emulationRails 路由:需要添加一个可选的 :user_id 来路由以进行用户模拟
【发布时间】:2013-04-28 08:41:15
【问题描述】:

我正在将 Refinery CMS 与一个扩展应用程序一起使用,该应用程序在其路由中包含以下内容:

namespace :sub_application do
  resources :employees
  resources :customers
  resources :yet_another_plural_resource
end

产生以下路线:

/sub_application/employees
/sub_application/employees/:emp_id
/sub_application/customers
/sub_application/customers/:cust_id
/sub_application/yet_another_plural_resource
.... (you get the picture)

现在,大多数用户将使用这些路线,但有些超级用户需要查看这些人正在查看的内容,就像他们查看内容一样。我对此的解决方案是通过路由系统将模拟的用户 ID 作为匹配变量传递,如下所示:

/sub_application/:user_id/employees
/sub_application/:user_id/employees/:emp_id
/sub_application/:user_id/customers
/sub_application/:user_id/customers/:cust_id
/sub_application/:user_id/yet_another_plural_resource
.... (you get the picture)

我需要在我的路由文件中添加什么,以便我可以同时拥有 :user_id 路由版本和常规版本?

【问题讨论】:

  • refinerycms 在这里可能或可能不是有用的信息,但我添加它以防万一。

标签: ruby-on-rails routing refinerycms


【解决方案1】:

有点小技巧,但您可以尝试使用“经典”嵌套资源,同时隐藏“用户”前缀。

namespace :sub_application do
  resources :employees
  resources :customers
  resources :yet_another_plural_resource

  # this block MUST be after the other routes
  # the empty path options should remove the 'users/' prefix
  resources :users, path: '' do 
    resources :employees
    resources :customers
    resources :yet_another_plural_resource  
  end
end

如果你想避免重复路线,你可以这样做:

namespace :sub_application do

  # store the routes in a lambda
  routes = ->{
    resources :employees
    resources :customers
    resources :yet_another_plural_resource
  }

  # apply the routes to current scope
  routes.call

  # then apply to nested resources scope
  resources :users, path: '', &routes
end

所有路由都将通向相同的控制器,因此无论请求是否使用user_id,您都必须调整逻辑。

如果您根本不想路由到 UsersController,只需将 only: [] 作为附加选项传递给 resources :users

编辑

实际上,有一种比将路由存储在 lambda 中以使它们在嵌套范围之外可用的更简单的方法:

namespace :sub_application do
  resources :users, path: '', shallow: true do
    resources :employees
    resources :customers
    resources :yet_another_plural_resource
  end
end

请注意,默认情况下它不会生成所有路由。请参阅the docs 了解更多信息。

【讨论】:

  • 不客气。编辑了我的答案以添加有关浅层路线的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多