2011-01-07 5 views
2

저는 승인 엔진으로 cancan을 사용하고 있습니다.레일 3 : 사용자에게 역할 추가

이미 사용자의 역할을 :

ROLES = %w[admin normal author corp] 

또한 역할을 추가하고 확인하는 방법이 있습니다

#cancan 
    def roles=(roles) 
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum 
    end 

    def roles 
    ROLES.reject do |r| 
     ((roles_mask || 0) & 2**ROLES.index(r)).zero? 
    end 
    end 

    def is?(role) 
    roles.include?(role.to_s) 
    end 

을 그리고 사용자 모델에서 # roles_mask :integer 있습니다.

그러나 정상적인 역할을 사용자에게 할당하는 after_save :add_normal_role을 갖고 싶습니다.

기본적으로 저는 각 사용자에게 역할을 할당하는 방법을 알지 못합니다.

이 작동하지 않는, 내가 무엇을 가지고 :

private 

    def add_normal_role 
    self.roles=(ROLES[1]) 
    end 

감사

답변

2

당신은 정상적인 역할이있는 사용자를 확보 before_create 콜백을 사용하여 시도해야합니다.

현재 콜백의 문제점은 after_save이므로 수정 사항이 기본적으로 저장되지 않습니다. after_save 콜백을 저장하면 무한 루프가 발생한다는 잘못된 생각입니다.) 이미 사용하고있는 코드와 동일한 before_save 콜백을 사용할 수도 있습니다.이 콜백도 사용할 수 있습니다.

그러나 객체가 만들어 질 때 (실제로는 모든 업데이트가 아니라) 일반 역할을 추가해야하기 때문에 before_create가 더 적합합니다.

+0

이 코드에서는 다음과 같은 오류가 있습니다 : 정의되지 않은 메서드 "&" "normal": 문자열 – donald

+1

네, 코드에'self.roles = ([ROLES [1]])'이 있어야한다고 생각합니다. 당신은 배열을 전달하고있다). –

+0

그래, 그게 다야! 감사. – donald