我有一个使用Devise的Rails项目以及非常棒的Pundit Gem。我正在使用三种不同的角色--Superadmin,Admin和User。
我想知道是否有可能以某种方式定义superadmin拥有管理员拥有的所有权利以及更多权限。这样我就不必再在我的观点中写<% if current_user.admin? || current_user.superadmin? %>
了。
答案 0 :(得分:3)
您在视图中使用-n assume "while (<>) { ... }" loop around program
-e program one line of program (several -e's allowed, omit programfile)
这一事实是一种特别臭的代码气味,表明您没有正确使用授权层。
您应该使用:
if current_user.admin? || current_user.superadmin?
在政策中定义规则 - 不要在整个地方传播授权逻辑(谁可以做什么)。
<% if policy(@post).update? %>
<%= link_to "Edit post", edit_post_path(@post) %>
<% end %>
如果您使用的是像Rolify这样的角色库,您还可以通过赋予superadmins admin和superadmin角色来简化这一过程:
class ApplicationPolicy
# ...
def update?
admin?
end
private
def admin?
user.admin? || user.superadmin?
end
end
class PostPolicy < ApplicationPolicy
def update?
super || record.author == user
end
end