安装可以扫描用户无法破坏自己

时间:2016-02-18 04:01:46

标签: ruby-on-rails cancancan

我正在设置cancancan来实现此功能: 如果用户是管理员,它可以摧毁每个用户,但他自己。 这是我的能力.rb

 class Ability
    include CanCan::Ability

    def initialize(user)
    if user.role == 'admin'
      cannot :destroy, User, id: user.id
    end
    end
end

这是我的观点

<h1>Listing Users</h1>

<table>
  <thead>
  <tr>
    <th>E-Mail</th>
    <th>Name</th>
    <th>Role</th>
    <th colspan="3"></th>
  </tr>
  </thead>

  <tbody>
  <% @users.each do |user| %>
      <tr>
        <td><%= user.email %></td>
        <td><%= user.name %></td>
        <td><%= user.role %></td>
        <% if can? :destroy, @user %>
        <%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %>
        <% end %>
      </tr>
  <% end %>
  </tbody>
</table>

即使使用此设置,现在每个用户的末尾都没有销毁链接。我想要的是每个用户背后都有一个销毁链接,但管理员自己。我该怎么办?谢谢!

2 个答案:

答案 0 :(得分:0)

仅仅因为管理员无法销毁自己,不会授予其销毁其他用户的权限。你可以试着给它销毁权限。

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.role == 'admin'
      cannot :destroy, User, id: user.id
    else
      can :destroy, User
    end
  end
end

答案 1 :(得分:0)

您的主要问题是,当if can? :destroy, @user不存在时,您正在致电@user

<% @users.each do |user| %>
  <% if can? :destroy, user %>
<% end %>

如果原始答案不起作用,或许您最好使用block来评估user对象:

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    case user.role
      when "admin"
        cannot :destroy, User do |x|
          x.id == user.id
        end
      end
    end
  end
end

这将允许您使用:

<%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } if can? :destroy, user %>

...虽然我认为解决第一个问题会解决您的问题。