2010-09-26 22 views
5

Estoy intentando implementar un sistema de "contexto" similar al utilizado por GitHub. Por ejemplo, se puede crear una publicación que pertenezca al Usuario o a una de las Empresas a las que pertenece el Usuario, según si el Usuario se encuentra en el contexto "Usuario" o un contexto que hace referencia a una de las Empresas.Enrutamiento de Rails 3 según el contexto

Como parte de esto, me gustaría poder enrutar en función del contexto actual del usuario. Por ejemplo, si el usuario está en su propio contexto, /dashboard debe enrutar a users/show, pero si están en el contexto de la empresa con ID 35, entonces /dashboard debe enrutar a companies/35/dashboard.

pude ruta /dashboard a un controlador específico encargado de tomar tales decisiones, tales como context#dashboard que luego podría hacer una redirect_to, pero esto no se siente del todo bien (tal vez porque estamos tomando lógica que los carriles de módulo de enrutamiento debe ser responsable y moverlo a un controlador?)

¿Cuál sería la forma correcta de resolver este problema en Rails 3?

+0

Entiendo que no se siente bien con el controlador del tablero como una opción de pseudo enrutador, pero tener el enrutador leyendo un modelo de contexto/sesión a partir de información pasada por cookies/params también parece extraño. – hellvinz

Respuesta

2

Finalmente encontré una solución a mi problema que me gusta. Esto usará las URL de mi pregunta original.

Primero, asuma un objeto Context almacenado en la sesión que almacena si el usuario está en un contexto de "usuario" o en un contexto de "compañía". Si el usuario se encuentra en un contexto de "empresa", la ID de la empresa en la que está trabajando también se encuentra en el objeto. Podemos obtener el contexto a través de un ayudante llamado get_context y podemos obtener el usuario actualmente conectado a través del current_user.

Ahora, hemos creado nuestras rutas como tan:

config/routes.rb:

MyApplication::Application.routes.draw do 
    get "dashboard" => "redirect", :user => "https://stackoverflow.com/users/show", :company => "/companies/:id/dashboard" 
end 

Ahora, 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 

Es bastante fácil de mantener las URLs reales para la redirección, donde pertenecen (en el archivo routes.rb) y esos datos se pasan a un controlador DRY. Incluso puedo pasar el ID del objeto de contexto actual en la ruta.

0

Su enfoque parece ser la mejor manera para mí. Cualquier otra cosa sería más abarrotada y no muy estándar.

+0

Parece que esto debería ser un comentario. –

Cuestiones relacionadas