2011-08-18 3 views
7

CanCan을 사용하여 내 권한을 처리하려고합니다. 내 사이트에는 다양한 권한 수준이 있으며 대부분은 상황을 인식합니다. 예를 들어, 내 3 대 모델의 관계는 다음과 같습니다.CanCan을 사용하여 상황 인식 권한 부여

class User < ActiveRecord::Base 
    has_many :league_relations 
    has_many :leagues, :through => :league_relations 
end 

class League < ActiveRecord::Base 
    has_many :league_relations 
    has_many :users, :through => :league_relations 
end 

class LeagueRelation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :league 
end 

참고 리그 리그는 리그의 중첩 된 리소스입니다. 내가하고 싶은 일은 사용자가 리그를 수정하고 league_relation에 저장된 데이터를 기반으로 각 사용자의 권한을 측정하는 것입니다. 그런 다음 사용자가 사용자 관계에 저장된 데이터 만 기반으로 리그 관계를 수정하길 원합니다.

간단 명료하게 말하자면, 기본적으로 LeagueRelations를 사용하여 리그 동작을 인증하고 User를 사용하여 LeagueRelations 동작을 인증하기를 원합니다. 즉 리그를 삭제하려면 league_relation.owner = true이지만 사용자는 소유자입니까? LeagueRelation을 삭제하려면 true 여야합니다. 리그 컨트롤러 내부에서 league_relation의 속성을 기반으로 권한을 부여하고 다른 컨트롤러의 다른 컨트롤러에서 다른 작업을 인증 할 수있는 방법은 무엇입니까? 더 자세한 설명이 필요하면 의견을 남기십시오.

감사합니다.

답변

10

좋아, 문제를 해결했습니다. 나의 유스 케이스는 CanCan README의 시작 부분에서 간략하게 언급되었고, 나는 그것을 놓쳤다. app/models /에서 current_user가 아닌 다른 매개 변수를 사용하는 새로운 Ability 클래스를 정의 할 수 있습니다. 이렇게하려면, 당신은 컨트롤러에 다음을 넣어 :

def current_ability 
    if params[:controller] == 'leagues' 
    @current_ability = LeagueAbility.new(current_user_league_relation) 
    elsif params[:controller] == 'league_relations' 
    @current_ability = LeagueRelationAbility.new(current_user_league_relation) 
    else 
    @current_ability = Ability.new(current_user) 
    end 
end 

는 이제 앱/모델 league_ability.rb를 만들 수 있습니다 /.

주목할 점은 응용 프로그램 컨트롤러가 하위 클래스의 메서드를 호출해야한다는 것입니다. 희망이 도움이됩니다!