0

認証と承認にdeviseとcancanを使用するアプリを作成しました。cancanを使用して、管理者とオペレーターの2つの役割を定義しました。管理者はすべてを管理でき、オペレーターはすべてを編集できますが、破棄はできません。3番目は、作成および管理できる通常のユーザーです。ただし、コードはデフォルトのelseブロックにのみ適用されます。これは私の能力クラスとindex.htmlです

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 %>
4

1 に答える 1

1

一時的な設定によると、オペレーターの許可とデフォルトの許可は同じです。モデルを編集するのではなく、すべてのモデルを読む権利しかありません。

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?-methodが正しく機能する場合、問題は、else-blockのみがトリガーされるということではなく、オペレーターに能力が不足しているということです。

于 2012-04-19T08:24:47.070 に答える