Serialize permissions (e.g. CanCan) with active_model_serializers

active-model-serializers, activemodel, cancan, ruby-on-rails

Solution

First, to get access to the `current_user` in the serializer context, use the new scope feature:

class ApplicationController < ActionController::Base
  ...
  serialization_scope :current_user
end

In case you are instantiating serializers manually, be sure to pass the scope:

model.active_model_serializer.new(model, scope: serialization_scope)

Then inside the serializer, add custom methods to add your own authorization pseudo-attributes, using `scope` (the current user) to determine permissions.

If you are using CanCan, you can instantiate your Ability class to access the `can?` method:

attributes :can_update, :can_delete

def can_update
  # `scope` is current_user
  Ability.new(scope).can?(:update, object)
end

def can_delete
  Ability.new(scope).can?(:delete, object)
end

Problem

How do I serialize permissions with active_model_serializers? I don't have access to `current_user` or the `can?` method in models and serializers.

Original source

Related problems