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]', это будет работать в вашей ситуации.

Другие вопросы по тегам