2012-04-19 4 views
0

Я создал приложение, которое использует devise и cancan для аутентификации и авторизации. Используя cancan, я определил две роли admin и operator. Администратор может управлять всем, и оператор может редактировать все, но не уничтожать, а третий - обычный пользователь, который может создавать и управлять. Но код идет только в блок else по умолчанию. Это мой класс способности и index.htmlRails: Проблема с 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

Вы можете показать, что такое метод 'role?' В 'user.rb' – MikDiet

ответ

1

В соответствии с вашими настройками на мгновение, ваши operater-разрешения и ваши стандартные разрешения_доступа одинаковы. Они имеют право читать все Модели, а не редактировать их.

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 

Таким образом, в случае, если ваш role? -метод работает правильно, ваша проблема не является, что только еще-блок сработал, но оператор не хватает способностей.

+0

Я дал разные функции CRUD администратору и обычным пользователям, но все же все пользователи имеют одинаковую функциональность, упомянутую в блоке по умолчанию например, управлять в этом случае, если я изменю его, чтобы прочитать все пользователи, которые смогут читать только. Роли назначаются с помощью флажка и его правильное отражение в db, но я до сих пор не могу понять, где это происходит. – Aayush

+0

Извините @AmritanshMishra, я не понимаю, что вы пытаетесь мне сказать. Единственное, что я могу вам точно сказать, это то, что вы не позволяете своему оператору модифицировать любую из ваших моделей. Например, если вы вызываете в своем представлении '<% if can? : update, @todo%> ', это применимо только к вашему администратору, а не к вашему оператору, поскольку ему разрешено читать только модель. Попробуйте добавить 'can: manage, Todo' к вашим возможностям оператора и проверить, получите ли вы желаемый результат. – klaffenboeck

+0

Спасибо !!! Это помогло мне! – Aayush

Смежные вопросы