Админ не может создавать предметы для себя с помощью CanCan? - PullRequest
1 голос
/ 04 мая 2019

Я использую CanCanCan для авторизации.Администратор может управлять всем, поэтому у них нет правил для каждого пользователя.В результате они не могут создавать элементы для себя по умолчанию.Похоже, мне нужно добавить кучу дополнительных сантехник, чтобы create в моих контроллерах работал так же для администраторов, как и для обычных пользователей.Причина в том, что Ability#attributes_for не предоставляет администратору пользователя атрибут user_id.

Как другие люди обходят это?Вы пишете код для конкретной обработки сценариев использования администратора в вашем представлении или контроллере?

Соответствующие части класса Способности

if user.admin?
  can manage, :all
else
  can manage, Purchase, user_id: user.id
end

Пример взаимодействия

2.6.2 :012 > Ability.new(User.find(3)).attributes_for(:create, Purchase)
 => {:user_id=>3}
2.6.2 :013 > Ability.new(User.find(4)).attributes_for(:create, Purchase)
 => {}

Пользователь 3 - general_user, Пользователь 4 - администратор

Вконтроллер

# relying on load_and_authorize_resource
def create
  puts @purchase.user_id # => nil for admin, 3 for general user
  # have to add this for admin use case
  @purchase.user = current_user
  ...
end

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Я бы не стал полагаться на объект Ability для назначения user_ids вашим новым объектам.Я думаю, что лучше явно написать это в контроллере.Кажется, более ясно, что происходит.Так что в основном просто инициируйте новый объект в методе создания и не полагайтесь на load_and_auhtorize_resource

def create
  @purchase = current_user.purchases.new(purchase_attributes)
end

Если бы пользователь не был авторизован, CanCanCan уже вмешался бы.

ps,Я был пользователем CanCanCan в течение многих лет, но недавно перешел в Pundit.Я думаю, то, как это было разработано, намного лучше и понятнее, чем CanCanCan.Проверьте это, если у вас есть время!

0 голосов
/ 06 июня 2019

В CanCanCan есть ошибка.Для определения способности can(:manage) нужен идентификатор.Создание записи не делает.Таким образом, файл способностей не позволяет вам создавать bc, он ищет только записи, которые он может найти с идентификатором.если вы определяете can :create, Purchase выше, где вы определяете :manage, вы должны быть хороши: D

if user.admin?
  can :manage, :all
else
  can :create, Purchase
  can :manage, Purchase, user_id: user.id
end
...