Rails создает пользователей, роли и проекты - PullRequest
1 голос
/ 12 ноября 2009

Я все еще плохо знаком с рельсами и 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 ]

1 голос
/ 12 ноября 2009

Лучший способ реализовать это - не реализовывать это. Я предлагаю использовать один из многих драгоценных камней, уже созданных, чтобы помочь вам с пользователями, ролями и разрешениями. Например:

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

acl9 дает вам отличный маленький DSL, который вы можете использовать для добавления разрешений и ролей пользователям. Его очень легко настроить, и он избавит вас от необходимости писать код самостоятельно.

acl9 действительно хорошо работает с разрешением (http://github.com/thoughtbot/clearance) для аутентификации.

0 голосов
/ 04 мая 2010

Я согласен с Джонни, но я советую вам взглянуть на канкан от Райана Бейтса

Я думаю, что гораздо проще реализовать и использовать.

...