我正在设置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>
即使使用此设置,现在每个用户的末尾都没有销毁链接。我想要的是每个用户背后都有一个销毁链接,但管理员自己。我该怎么办?谢谢!
答案 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 %>
...虽然我认为解决第一个问题会解决您的问题。