2011-05-13 9 views
1

여기 내 문제가 있습니다 :CANCAN 정의되지 않은 메소드`user_type? ' "admin": 문자열

저는 cancan gem을 사용하고 있습니다. 나는 모든 것이 잘되고 있다고 생각한다. 단 하나만 제외하고는 undefined method 'user_type?' for "admin":String이 나온다.

여기

class Ability 
    include CanCan::Ability 
    def initialize(user) 
     user ||= User.new # guest user 
     if user.user_type? :admin 
     can :manage, :all 
     # [code code code code commented to find more easily the problem] 
     else 
      can :read, :all 
     end 
    end 
end 

내 user.rb

require 'digest/sha2' 

class User < ActiveRecord::Base 
    #definisco i ruoli 
    ROLES = %w[admin client banned] 
    default_scope :order => 'user' [...] 

내가 수정해야 할 무엇을 알아낼 수 없습니다 내 ability.rb입니다. 왜 if user.user_type? :admin은 현재 사용자 속성을 확인하지 않습니까? 관심을 가져 주셔서 감사합니다.

UP : 좋아, 나는 응용 프로그램 컨트롤러에 선언 된 "current_user"메서드가 필요합니다. 이제 나는 그것에 대해 연구한다. 곧 뉴스.

+2

? 방법? – Shreyas

+0

어디에서 승인을 확인합니까? 무슨 컨트롤러 요? (컨트롤러 인 경우) 해당 코드도 붙여 넣으십시오. 어떻게 든 CanCan에 전달되는'user' 변수는''admin "'값을 가진 문자열입니다. 왜냐하면'user'가 실제로'User' 인스턴스가되기를 원합니다. –

+0

해결됨! ability.rb 에 user.user_type == "관리자"애플리케이션 컨트롤러 제가 추가 데프 @current_user = User.find_by_id를 CURRENT_USER 경우 (세션 [: USER_ID]) 단부 THANKS! –

답변

1

이런 식으로해야합니다. 더 나은 접근 방법이라고 생각합니다.

DB에 시드 역할.

그리고 응용 프로그램 도우미에이 코드를 붙여 넣으십시오.

def is_admin?(user) 
    admin_role = Role.find(:first, :conditions => ["name = ?", "admin"]) 
    return user.roles.include?(admin_role) 
end 

그리고

  class Ability 
      include CanCan::Ability 
      def initialize(user) 
       user ||= User.new # guest user 
       if is_admin?(user) 
        can :manage, :all 
        # [code code code code commented to find more easily the problem] 
       else 
        can :read, :all 
       end 
      end 
      end 

그리고 그것은 잘 작동합니다 같은 기능 통화에서 ....... 당신이 USER_TYPE를 정의

관련 문제