Ответ 1
Я никогда не использовал ActiveAdmin, поэтому я не совсем уверен, что мне что-то не хватает, но не похоже, что эта каркас полагается на CanCan. Поэтому я предполагаю, что вы определяете метод current_ability
, как описано в вики, и он создается с помощью Ability.new(current_user)
.
Если этот случай и ваш current_user
могут быть либо User
, либо AdminUser
, тогда нет никакой проблемы при проверке этого в классе Ability
:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.kind_of? AdminUser
can :manage, Item
elsif user.kind_of? User
can :read, Item
end
end
end
Вы можете просто взглянуть на тип пользователя и соответственно изменить правила. Вы можете также использовать is_a?
вместо kind_of?
для более строгой проверки, но это, вероятно, не требуется и может вызвать проблемы, если вы позже захотите наследовать.
Другой способ, которым вы можете проверить, - определить метод admin?
в обеих моделях. Это может быть лучшим способом сделать это, поскольку явная проверка типов не очень популярна в рубине - это часто ограничивает ваши варианты. Это может выглядеть так:
class User < ActiveRecord::Base
def admin?
false
end
end
class AdminUser < ActiveRecord::Base
def admin?
true
end
end
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.admin?
can :manage, Item
else
can :read, Item
end
end
end