Rails 3 маршрутизация на основе контекста - PullRequest
5 голосов
/ 27 сентября 2010

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

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

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

Как правильно решить эту проблему в Rails 3?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

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

0 голосов
/ 28 сентября 2010

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

...