# It'd be easy to add a DSL to existing policy frameworks such as pundit or activepolicy. class MessagePolicy < Policy rule("IsAdmin") { |user| user.is_admin? } rule("IsPublisher") { |user| user.publisher? } rule("IsOwner") { |user, message| message.user_id == user.id } permit :read, true permit :create, Any(IsAdmin, IsPublisher) permit :update, Any(IsAdmin, All(IsPublisher, IsOwner)) permit :delete, Any(IsAdmin, All(IsPublisher, IsOwner)) end