2012-08-14 44 views
5

Tengo administradores y usuarios normales en mi aplicación web. Quiero hacer que su raíz (/) sea diferente según quiénes sean. Se accede a la raíz desde muchas páginas diferentes, por lo que sería mucho más fácil si pudiera hacerlo en el archivo routes.rb. Aquí está mi archivo actual.¿Cómo crear una raíz dinámica en Rails 3?

ProjectManager::Application.routes.draw do 
    root :to => "projects#index" 
end 

¿Alguien puede por favor vincularme a un ejemplo que me puede mostrar la dirección para entrar? ¿Hay alguna forma de poner la lógica en el archivo de rutas? Gracias por toda la ayuda.

Respuesta

0

No se puede cambiar la raíz de forma dinámica, pero hay varias maneras de fingirla.

La solución que desea debe tener lugar en el controlador de su aplicación o en el controlador raíz "predeterminado". La solución más limpia y fácil es simplemente hacer que su controlador de aplicación redirija a la acción adecuada en un filtro anterior que solo se ejecuta para esa página. Sin embargo, esto hará que cambie la url de los usuarios y ya no estarán más en la raíz.

Su segunda opción es hacer que el método que ha especificado como raíz represente una vista diferente bajo cualquier condición que esté buscando. Sin embargo, si esto requiere algún cambio importante en la lógica más allá de simplemente cargar una vista separada, es mejor redireccionar.

2

Hay algunas opciones diferentes:

1. lambda en el archivo de rutas (no muy railsy)

previously explained

2. redirección en el controlador de aplicación basado en un filtro antes (esto es óptimo, pero su ruta de administrador no estará en la raíz)

fuente rails guides - routing

tendría dos rutas y dos controladores. por ejemplo, puede tener un HomeController y luego un AdminController. Cada uno de ellos tendría una acción index.

su archivo config/routes.rb tendría

namespace :admin do 
    root to: "admin#index" 
end 

root to: "home#index" 

El método de espacio de nombres le da una ruta en /admin y la raíz normal sería accesible en '/'

Entonces ser seguro; en su controlador de administrador, agregue un before_filter para redirigir a los que no sean administradores, y en el controlador de su hogar podría redirigir a cualquier usuario administrador.

3. Cambiando dinámicamente el diseño según la función del usuario.

En el mismo controlador que su raíz va, agregue un método de ayuda que cambie el diseño.

layout :admin_layout_filter 
private 
def admin_layout_filter 
    if admin_user? 
    "admin" 
    else 
    "application" 
    end 
end 

def admin_user? 
    current_user.present? && current_user.admin? 
end 

A continuación, en la carpeta de diseños, agregue un archivo llamado admin.html.erb

fuente: rails guides - layouts and routing

5

simplemente Puede crear controlador de ruta raíz.

class RoutesController < ActionController::Base 
    before_filter :authenticate_user! 

    def root 
    root_p = case current_user.role 
     when 'admin' 
     SOME_ADMIN_PATH 
     when 'manager' 
     SOME_MANAGER_PATH 
     else 
     SOME_DEFAULT_PATH 
     end 

    redirect_to root_p 
    end 
end 

En su routes.rb:

root 'routes#root' 

P. S. ejemplo espera usar Devise, pero puede personalizarlo para sus necesidades.