Je suis encore assez nouveau pour les rails et activerecord, alors s'il vous plaît excuser tous les oublis.Rails créant des utilisateurs, des rôles, et des projets
J'ai 3 modèles que j'essaie de lier ensemble (et un 4ème pour faire le lien) pour créer un schéma d'autorisation en utilisant des rôles définis par l'utilisateur.
class User < ActiveRecord::Base
has_many :user_projects
has_many :projects, :through => :user_projects
has_many :project_roles, :through => :user_projects
end
class Project < ActiveRecord::Base
has_many :user_projects
has_many :users, :through => :user_projects
has_many :project_roles
end
class ProjectRole < ActiveRecord::Base
belongs_to :projects
belongs_to :user_projects
end
class UserProject < ActiveRecord::Base
belongs_to :user
belongs_to :project
has_one :project_role
attr_accessible :project_role_id
end
Le modèle project_roles contient un nom de rôle défini par l'utilisateur, et booléens qui définissent si le rôle donné a des autorisations pour une tâche spécifique. Je suis à la recherche d'une solution élégante pour référencer cela n'importe où dans le projet de mon application facilement.
J'ai déjà un système de rôle implémenté pour l'ensemble de l'application. Ce que je cherche vraiment, c'est que les utilisateurs seront capables de gérer leurs propres rôles au cas par cas. Chaque projet est configuré avec un rôle d'administrateur par défaut immuable et le créateur du projet est ajouté lors de la création du projet. Puisque les utilisateurs créent les rôles, j'aimerais pouvoir extraire une liste de noms de rôles du projet et des modèles d'utilisateurs par association (à des fins d'affichage), mais pour tester l'accès, je voudrais simplement faire référence eux par ce qu'ils ont accès sans les référencer par leur nom.
Peut-être que quelque chose comme ça?
def has_perm?(permission, user) # The permission that I'm testing
user.current_project.project_roles.each do |role|
if role.send(permission) # Not sure that's right...
do_stuff
end
end
end
Je pense que je suis dans ma tête sur celui-ci parce que je continue à tourner en rond sur la meilleure façon que je peux mettre en œuvre.
J'ai mis à jour la question dans l'espoir de clarifier un peu. J'ai regardé quelques gemmes, et elles ne semblent pas vraiment convenir. La raison en est que je ne serai pas capable de référencer l'accès en fonction du nom du rôle parce que je ne connaîtrai jamais le nom du rôle. Le nom sera à des fins d'affichage seulement. Connaissez-vous une gemme ou peut-être une autre solution qui peut gérer ce genre de comportement? Je sens que je suis déjà proche, c'est presque fonctionnel, mais pas très élégant. :) –