Разрешения на уровне поля с использованием CanCanCan или Pundit

В настоящее время я использую Rails 4.1.14 с CanCanCan 1.13.1 и определил детальные разрешения на уровне модели / записи. Администраторы могут управлять всеми статьями, но пользователи могут редактировать только статьи, написанные ими.

Чтобы обычные пользователи не могли редактировать определенные поля, я делаю поля видимыми в rails_admin в зависимости от роли.

visible do 
  bindings[:object].id == bindings[:view].current_user.roles.include? :admin
end

Я также использую гем https://github.com/aasm/aasm и создал настраиваемые действия, чтобы пользователь мог перемещать записи в новые состояния.

Но что мне действительно нужно, так это включить разрешения на уровне поля в зависимости от роли / записи пользователя. Я не могу найти никаких документов на страницах CanCanCan или https://github.com/elabs/pundit.

У кого-нибудь есть опыт в этом?


person Dmitry Polyakovsky    schedule 16.01.2016    source источник


Ответы (1)


Вы имеете в виду, что администратору должно быть разрешено редактировать все поля записи, а редактору разрешено изменять только поля x и y?

Да, это возможно в pundit, поскольку он интегрируется с сильными параметрами (которые вы все равно должны использовать). Также есть пример в readme pundit (см .: Сильные параметры). Я упростил пример из ридми:

# post_policy.rb
def permitted_attributes
  if user.admin?
  [:title, :body, :tag_list]
else
  [:tag_list]
end

# posts_controller.rb
@post.update_attributes(permitted_attributes(@post))

помощник permitted_attributes в контроллере предоставляется pundit и автоматически вызывает метод permitted_attributes введенной политики.

person srecnig    schedule 17.01.2016
comment
простое и отличное решение - person mohamed; 22.02.2021