CanCan: только администратор может удалять пользователей, но он не должен удалять себя
def initialize(user)
if user.has_role? :admin
can :manage, :all
can :destroy, User
can [:update , :destroy], [Article, Comment]
else
can :read, :all
end
как заставить только администратора удалять пользователей, но не может удалить себя?
Я использую драгоценный камень wice_grid, и я добавил это к своему представлению, но все же администратор может удалить себя
g.column do |user|
if can? :destroy, @user && !current_user(user)
link_to('Delete', user, method: :delete, data: { confirm: 'You sure?' })
end
end
3 ответа
Решение
def initialize(user)
if user.has_role? :admin
can :manage, :all
cannot :destroy, User, id: user.id
else
can :read, :all
end
g.column do |user|
if can? :destroy, user
link_to('Delete', user, method: :delete, data: { confirm: 'You sure?' })
end
end
Прочитайте Ability-Precedence для этого, кстати, вы можете сделать это:
if user.admin?
can :manage, :all
cannot :destroy, User, :id => current_user.id
end
Спасибо
Попробуй это
def initialize(user)
if user.has_role? :admin
can :read, :all
can [:update, :destroy], [Article, Comment, User]
cannot :destroy, User, id: user.id # it means do not destroy own-self(the id of object to be deleted is not equal to admin's id)
else
can :read, :all
end
не пишите 'manage: all', как если бы он был найден, управление никогда не прекратится, означает, что остальная часть кода никогда не будет выполняться, потому что 'manage: all' означает, что может делать все, с другой стороны, если вы указали как 'can [:update,:destroy], [Article, Comment, User]', это будет работать в вашей ситуации.