1

저는 아직 레일스와 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 

나는 내가 가장이 구현할 수있는 방법에 대한 원에서 계속 실행하기 때문에 나는이 일에 내 머리에있어 생각합니다.

답변

1

이것을 구현하는 가장 좋은 방법은 이것을 구현하지 않는 것입니다. 이미 사용자, 역할 및 사용 권한을 갖는 데 도움이되도록 만들어진 많은 보석 중 하나를 사용하는 것이 좋습니다. 예 :

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

acl9는 사용 권한과 역할을 사용자에게 추가하는 데 사용할 수있는 아주 작은 DSL입니다. 설정하기는 정말 쉽고 코드를 직접 작성하는 번거 로움을 덜어줍니다.

acl9는 인증을위한 클리어런스 (http://github.com/thoughtbot/clearance)와 함께 잘 작동합니다.

+0

조금 명확하게하기 위해 질문을 업데이트했습니다. 나는 보석을 들여다 보았고, 실제로는 맞지 않는 듯하다. 그 이유는 역할의 이름이 무엇인지 알 수 없으므로 역할 이름을 기반으로 액세스를 참조 할 수 없기 때문입니다. 이름은 표시 목적으로 만 사용됩니다. 그런 종류의 행동을 처리 할 수있는 보석 또는 가능성있는 해결책을 알고 있습니까? 나는 이미 가까워 졌다고 느낍니다. 거의 기능적이며 우아하지는 않습니다. :) –

0

나는 jonnii에 동의하지만 난 당신이

나는 그것을 구현 및 사용이 훨씬 간단하다고 생각 라이언 베이츠에서 cancan에서 살펴보고 조언.

+0

Cancan은 데이터베이스에 사용자 priveleges를 저장하지 않습니다. –

관련 문제