Rails创建用户,角色和项目

时间:2009-11-12 00:31:29

标签: ruby-on-rails activerecord attributes has-many has-many-through

我对rails和activerecord还是比较新的,所以请原谅任何疏忽。

我有3个模型,我试图将它们绑在一起(并且第4个实际上是绑定),以使用用户定义的角色创建权限方案。

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

project_roles模型包含用户定义的角色名称和布尔值,用于定义给定角色是否具有特定任务的权限。我正在寻找一个优雅的解决方案,可以轻松地从我的应用程序项目中的任何位置引用它。

我已经为整个应用程序实现了一个角色系统。我真正想要的是用户将能够在每个项目的基础上管理自己的角色。每个项目都使用不可变的默认管理员角色进行设置,项目创建者在项目创建时添加。

由于用户正在创建角色,我希望能够通过关联(用于显示目的)从项目和用户模型中提取角色名称列表,但是为了测试访问权限,我想简单地引用它们通过他们可以访问的内容,而无需通过名称引用它们。

也许是这样的?

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

我认为我对这个问题很感兴趣,因为我一直在讨论如何最好地实现这一点。

2 个答案:

答案 0 :(得分:1)

实现此目的的最佳方法是不实现此目的。我建议使用已创建的众多gem中的一个来帮助您了解用户,角色和权限。例如:

acl9
http://github.com/be9/acl9

acl9为您提供了一个很棒的小DSL,您可以使用它向用户添加权限和角色。设置起来非常简单,并且可以省去自己编写代码的麻烦。

acl9非常适合清除(http://github.com/thoughtbot/clearance)进行身份验证。

答案 1 :(得分:0)

我同意jonnii,但我建议你看看Ryan Bates的cancan

我认为实施和使用起来要简单得多。