我终于找到了我喜欢的问题的解决方案。这将使用我原始问题中的 URL。
首先,假设一个会话存储Context
对象存储用户是在“用户”上下文还是“公司”上下文中。如果用户在“公司”上下文中,那么他们正在工作的公司的 ID 也在对象中。我们可以通过一个名为的助手获取上下文get_context
,我们可以通过current_user
.
现在,我们这样设置我们的路线:
config/routes.rb
:
MyApplication::Application.routes.draw do
get "dashboard" => "redirect", :user => "/users/show", :company => "/companies/:id/dashboard"
end
现在,app/controllers/redirect_controller.rb
:
class RedirectController < ApplicationController
def method_missing(method, *args)
user_url = params[:user]
company_url = params[:company]
context = get_context
case context.type
when :user
redirect_to user_url.gsub(":id", current_user.id.to_s)
when :company
redirect_to company_url.gsub(":id", context.id.to_s)
end
end
end
将重定向的实际 URL 保存在它们所属的位置(在文件中!)很容易,routes.rb
并且该数据被传递到 DRY 控制器。我什至可以在路由中传入当前上下文对象的 ID。