2013-01-04 9 views
1

CanCanrolify을 사용하여 팜 모델에 대한 액세스 권한을 설정합니다.CanCan/Rolify : 모델의 사용자에 대한 읽기 액세스가 거부되었습니다.

# ability.rb 
class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # Create guest user aka. anonymous (not logged-in) when user is nil. 
    user ||= User.new 

    if user.has_role? :admin 
     can :manage, :all 
    else # guest user aka. anonymous 
     can :read, :all 
     # logged in user 
     if user.has_role? :user 
     can :create, Farm 
     can :manage, Farm, :user_id => user.id 
     end 
    end 
    end 
end 

여기에 나열된 몇 가지 테스트 데이터를 내 응용 프로그램을 씨앗 :

# seeds.rb 
puts 'SETTING UP DEFAULT USER LOGIN' 
user1 = User.create! name: 'First User', email: '[email protected]', password: 'password' 
puts 'New user created: ' << user1.name 
user2 = User.create! name: 'Second User', email: '[email protected]', password: 'password' 
puts 'New user created: ' << user2.name 
user9 = User.create! name: 'Default Admin', email: '[email protected]', password: 'password' 
puts 'New user created: ' << user9.name 

puts 'ADDING SPECIAL ROLES TO USERS' 
# No role for user1 here. 
user2.add_role! :user 
user2.save! 
user9.add_role :admin 
user9.save! 

puts 'SETTING UP SOME FARMS' 
farm1 = Farm.create! name: 'User1 farm', location: 'Mexico' 
farm1.user = user1 
farm1.save! 
puts 'New farm created: ' << farm1.name 
farm2 = Farm.create! name: 'User2 farm', location: 'Bolivia' 
farm2.user = user2 
farm2.save! 
puts 'New farm created: ' << farm2.name 
farm3 = Farm.create! name: 'Nobody\'s farm', location: 'Death Valley' 
puts 'New farm created: ' << farm3.name 

을 나는 농장은 사용자에 의해 (읽기 전용) 액세스 할 수있는 알아 레일 콘솔에서 다음 명령을 실행합니다 :

> Farm.accessible_by(Ability.new(User.find_by_name("First User"))).count 
=> 3 
> Farm.accessible_by(Ability.new(User.find_by_name("Second User"))).count 
=> 1 
> Farm.accessible_by(Ability.new(User.find_by_name("Default Admin"))).count 
=> 3 

user1에는 할당 된 역할이 없습니다.

질문 : 사용자 2가 ability.rb에 정의 된대로 모든 팜에 액세스 할 수없는 이유는 무엇입니까?

답변

0

주문 당신이 능력을 정의하는 것을 배워야 만했습니다 ! documentation of CanCan은 모두가 읽을 수있는 세부 정보를 보여줍니다. 간단히 :

일반 규칙이 먼저 적용됩니다.

여기에 내가 함께 ...

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # Create guest user aka. anonymous (not logged-in) when user is nil. 
    user ||= User.new 

    if user.has_role? :admin 
     can :manage, :all 
    else 
     # logged in user 
     if user.has_role? :user 
     can :manage, Farm, :user_id => user.id 
     can :create, Farm 
     end 
     # guest user aka. anonymous 
     can :read, :all 
    end 
    end 
end 
까지 함께 제공되는 설정은 다음과 같습니다