2012-06-17 4 views
1

레일즈 3.0.13, Devise, CanCan 및 ActiveScaffold; Ruby에서 1.9.3 194 RVM (차이가있을 경우)Devise User에 역할 및 권한을 추가합니다. NoMethodError : 정의되지 않은 메서드

devise 사용자 및 특정 권한에 대한 일반적인 역할을 설정하려고합니다 (역할에 기본 권한이 있지만 사용자가 권한을 덮어 쓸 수있는 요구 사항이 있습니다). 수평). ability.rb는 문제없이 is_implementer? 방법을 사용 할 수 있습니다

보관할 나는 VAR (@user)에 사용자를 할당, 콘솔로 이동 한 다음 할 경우 역할이나 user_permissions이 오류가 @user.role 또는 @user.user_permissions :

NoMethodError: undefined method `role' for #<ActiveRecord::Relation:0x98173e8> 
    from /home/scott/.rvm/gems/[email protected]/gems/activerecord-3.0.13/lib/active_record/relation.rb:374:in `method_missing' 
    from (irb):7 
    from /home/scott/.rvm/gems/[email protected]/gems/railties-3.0.13/lib/rails/commands/console.rb:44:in `start' 
    from /home/scott/.rvm/gems/[email protected]/gems/railties-3.0.13/lib/rails/commands/console.rb:8:in `start' 
    from /home/scott/.rvm/gems/[email protected]/gems/railties-3.0.13/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

모델 :

사용자 클래스

class User < ActiveRecord::Base 
    has_and_belongs_to_many :user_groups 
    has_many :user_permissions 

    belongs_to :role 

    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :role_id 

    def is_implementer? 
    self.role.implementer? 
    end 
end 

사용자 권한

class UserPermission < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :permission 
end 

역할

class Role < ActiveRecord::Base 
    has_many :default_role_permission 
    has_many :users 

    def implementer? 
    self.name == "Implementer" 
    end 
end 

당신이 무엇을보고 싶다면 알려주세요 (예를 들어, CanCan의 능력 .rb).

+0

모든 데이터베이스 마이그레이션을 실행 했습니까? – sczizzo

+0

예 (잠시 시간을내어 맹목적으로 답변하지 않았 음을 확인했습니다.) – ScottJShea

+0

콘솔에서 무엇을하고 있습니까? –

답변

2

데이터를 가져 오지 않고 사용자를 인스턴스화하지 않는 @user = User.where(:id => 2)을 수행 할 때. 그것은 당신의 오류가 지적한 ActiveRecord :: Relation입니다. 당신은 당신이

@user = User.where(:id => 2).first 

또는

@user = User.find(2) # this is more common 

을 할 수있는 경우에 따라서 User.where(:active => true).limit(5)

과 같은 작업을 수행 할 수 있습니다 그리고 당신은 #role 전화 또는 #user_permissions 때문에 할 수 있기 때문에

여기가

입니다 이제 @user는 실제로 User 인스턴스입니다.

+0

<내 머리를 짚고 넘어갔습니다. 책상> ARG. 감사. – ScottJShea

관련 문제