Prácticamente hay dos formas de manejar múltiples roles en una aplicación en Rails.

La más común es con un modelo de usuarios y un atributo rol que permita distinguir el tipo de usuario, la segunda forma es con múltiples tablas, una para cada tipo de usuario distinto, y es la que abordaremos en este tutorial.

Separar las tablas (y por lo mismo los modelos) tiene sentido cuando la lógica (los métodos que implementemos) sean muy distintos para cada tipo de usuario.

Para esta demostración necesitamos un proyecto en rails con devise agregado como gema y dos modelos deviseables, si ya los tienes pasa al siguiente paso

Setup de devise y creación de los modelos devisebles

Agregamos al gemfile:

Acto seguido en el terminal hacemos bundle:

Utilizamos el generador de rails para crear los archivos iniciales y de configuración de devise:

Y ahora generaremos el primer modelo al que llamaremos user:

y finalmente generaremos un segundo modelo llamado company:

 Manejando múltiples usuarios

Si ahora vemos nuestras rutas veremos que cada modelo tiene su propio login, son formularios distintos, con rutas distintas y se procesan en rutas distintas, por lo que practicamente estamos listos

Pero con una sola gran pregunta pendiente, ¿Cómo podemos saber si un usuario está logeado?

Este podría ser una empresa o un usuario corriente, entonces podemos utilizar los helpers incluídos de devise como user_signed_in? y company_signed_in?, pero también tendremos un current_user y un current_company y nuestro código comienza a ser más complejo de manejar y se vuelve muy complejo con más de dos tipos de usuarios.

Para resolver este problema agregaremos al application controller

Luego en lugar de utilizar current_user o current_company podemos utilizar current_entity

Por ejemplo si ingresamos al sistema como una compañía y mostramos current_entity veremos:

company

Share Button

Director de DesafíoLatam. Ingeniero Civil Informático de la Universidad Federico Santa María. Emprendedor lean, dedicado al desarrollo de una mejor web con ruby on rails. Fanático de los números y las métricas, la música y la fotografía.