ruby-on-rails-3 routing contextpath

ruby on rails 3 - Rails 3 enrutamiento basado en el contexto



ruby-on-rails-3 routing (2)

Estoy tratando de 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.

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 debería enrutar a los users/show , pero si están en el contexto de la empresa con ID 35, entonces /dashboard debería enrutar a companies/35/dashboard .

Podría dirigir /dashboard a un controlador especial responsable de tomar tales decisiones, como context#dashboard que podría hacer un redirect_to , pero esto no se siente del todo bien (tal vez porque estamos tomando la lógica de que el módulo de enrutamiento de Rails debería ser responsable de moverlo a un controlador?)

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


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

En primer lugar, suponga un objeto de Context almacenado en la sesión que almacena si el usuario se encuentra en un contexto de "usuario" o en un contexto de "empresa". 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 helper llamado get_context y podemos obtener el usuario actualmente conectado a través de current_user .

Ahora, configuramos nuestras rutas así:

config/routes.rb :

MyApplication::Application.routes.draw do get "dashboard" => "redirect", :user => "/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 mantener las URL reales para el redireccionamiento a donde pertenecen (en el archivo routes.rb ) y esos datos se transfieren a un controlador DRY. Incluso puedo pasar el ID del objeto de contexto actual en la ruta.


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