2010-09-26 3 views
5

Я пытаюсь реализовать «контекстную» систему, подобную той, что используется GitHub. Например, Post может создаваться принадлежащей либо Пользователю, либо Пользователю, которому принадлежит Пользователь, в зависимости от того, находится ли Пользователь в контексте «Пользователь» или в контексте, который относится к одной из компаний.Rails 3 маршрутизации на основе контекста

В качестве части этого я хотел бы иметь возможность выполнять маршрутизацию на основе текущего контекста пользователя. Например, если Пользователь находится в своем собственном контексте, /dashboard должен маршрутизировать до users/show, но если они предназначены для Компании с идентификатором 35, то /dashboard должен маршрутизировать до companies/35/dashboard.

Я мог маршрут /dashboard на специальный контроллер, ответственный за принятие таких решений, таких как context#dashboard, которые могли бы сделать redirect_to, но это не чувствует себя совершенно правильно (возможно, потому, что мы с логикой, что Rails маршрутизации модуль должен отвечать и перемещать его на контроллер?)

Что было бы правильным способом решить эту проблему в Rails 3?

+0

Я понимаю, что вы не чувствуете себя правильно с контроллером панели управления в качестве опции псевдо-маршрутизатора, но наличие маршрутизатора, читающего модель контекста/сеанса из информации, передаваемой куки-файлами/params, также кажется странным. – hellvinz

ответ

2

Наконец-то я нашел решение своей проблемы, которая мне нравится. Это будет использовать URL-адреса из моего исходного вопроса.

Во-первых, предположим, что объект хранится в сеансе Context, который хранит, находится ли пользователь в контексте пользователя или в контексте компании. Если пользователь находится в контексте «компании», то идентификатор компании, с которой они работают, также находится в объекте. Мы можем получить контекст через помощника с именем get_context, и мы можем получить зарегистрированного пользователя в настоящий момент через current_user.

Теперь мы создали наши маршруты, так:

config/routes.rb:

MyApplication::Application.routes.draw do 
    get "dashboard" => "redirect", :user => "https://stackoverflow.com/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 

Это достаточно легко держать фактические адреса для редиректа где они принадлежат (в файле routes.rb!) и данные передаются контроллеру DRY. Я даже могу передать идентификатор текущего объекта контекста в маршруте.

0

Ваш подход кажется лучшим для меня. Все остальное было бы более загроможденным и не очень стандартным.

+0

Похоже, это должен быть комментарий. –