Я наконец нашел решение своей проблемы, которое мне нравится.При этом будут использоваться URL из моего исходного вопроса.
Сначала предположим сохраненный в сеансе объект Context
, в котором хранится информация о том, находится ли пользователь в контексте «пользователя» или в контексте «компании».Если пользователь находится в контексте «компании», то идентификатор компании, с которой он работает, также присутствует в объекте.Мы можем получить контекст через помощника с именем 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
!)и эти данные передаются на СУХОЙ контроллер.Я даже могу передать идентификатор текущего объекта контекста в маршруте.