2012-04-19 3 views
0

인증 및 권한 부여에 개발자 및 cancan을 사용하는 앱을 만들었습니다. cancan을 사용하여 admin과 operator라는 두 가지 역할을 정의했습니다. 관리자는 모두를 관리 할 수 ​​있으며 운영자는 모두 삭제할 수 있지만 삭제할 수는 없으며 세 번째 사용자는 생성하고 관리 할 수있는 일반 사용자입니다. 그러나 코드는 기본 else 블록에만 적용됩니다. 이는 내 능력 클래스와 index.html을레일스 : Cancan 관련 문제

class Ability 
include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user 

    if user.role? :admin 
     can :manage, :all 
    elsif user.role? :operator 
     can :read, :all 
    else 
     can :read, :all 
    end 
    end 
end 

index.html을하여 잠시 설정에 따라

<h1>Listing todos</h1> 

<table> 
    <tr> 
    <th>Name</th> 
    <th>Description</th> 
    <th></th> 
    <th></th> 
    <th></th> 
    </tr> 

<% @todos.each do |todo| %> 
    <tr> 
    <td><%= todo.name %></td> 
    <td><%= todo.description %></td> 
    <% if can? :show, @todo %> 
    <td><%= link_to 'Show', todo %></td> 
    <% end %> 
     <% if can? :update, @todo %> 
    <td><%= link_to 'Edit', edit_todo_path(todo) %></td> 
    <% end %> 
     <% if can? :destroy, @todo %> 
    <td><%= link_to 'Destroy', todo, :confirm => 'Are you sure?', :method => :delete %></td> 
    <% end %> 
</tr> 
<% end %> 
</table> 

<br /> 
<% if can? :destroy, @todo %> 
<%= link_to 'New Todo', new_todo_path %> 
<% end %> 
+1

'user.rb'에서'role? '메서드를 보여줄 수 있습니까? – MikDiet

답변

1

, 당신의 OPERATOR 시스템-권한과 기본-권한이 동일하다. 그들은 모든 모델을 읽을 수있는 권리 만 가지고 있으며 편집 할 수는 없습니다. 단지 다른 블록이 트리거됩니다,하지만 운영자가 능력이 부족한 것을 당신 올바르게 작동 -method role?를, 당신의 문제가 아닌 경우에 따라서

if user.role? :admin 
    can :manage, :all 
elsif user.role? :operator 
    can :read, :all # no managing-abilities defined here 
else 
    can :read, :all # same abilities as operator 
end 

,.

+0

운영자 admin과 일반 사용자에게 다른 CRUD 기능을 부여했지만 모든 사용자는 기본 블록에서 언급 한 동일한 기능을 갖습니다 이 경우에는 모든 사용자가 읽기 전용으로 변경할 수 있도록 변경하면 관리하십시오. 역할은 확인란을 사용하여 할당되며 DB에 제대로 반영되지만 여전히 잘못 될 수는 없습니다. – Aayush

+0

미안 @AmritanshMishra, 나는 네가 나에게 말하려고하는 것을 이해하지 못한다. 내가 말할 수있는 유일한 사실은 운영자가 귀하의 모델을 수정할 수 없도록하는 것입니다. 예를 들어,보기에서'<% if can? : update, @todo %>'는 운영자가 아닌 관리자에게만 적용됩니다. 왜냐하면 관리자는 모델을 읽을 수 있기 때문입니다. 'can : manage, Todo'를 운영자의 능력에 추가하고 원하는 결과를 얻는 지 확인하십시오. – klaffenboeck

+0

감사합니다 !!! 그것은 나를 도왔다! – Aayush