使用active_model_serializers序列化权限(例如CanCan)

时间:2012-07-25 23:25:00

标签: ruby-on-rails cancan activemodel active-model-serializers

如何使用active_model_serializers序列化权限?我无法访问模型和序列化程序中的current_usercan?方法。

3 个答案:

答案 0 :(得分:22)

首先,要访问序列化程序上下文中的current_user,请使用新范围功能:

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

如果您手动实例化序列化程序,请务必通过范围:

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

然后在序列化程序中,添加自定义方法以添加您自己的授权伪属性,使用scope(当前用户)来确定权限。

如果您使用的是CanCan,则可以实例化您的Ability类以访问can?方法:

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

答案 1 :(得分:2)

我们创建了一个提供此功能的gem:https://github.com/GroupTalent/active_model_serializers-cancan

答案 2 :(得分:2)

我认为你可以传递你想要的任何内容serialization_scope,所以我只是通过了能力。

class ApplicationController < ActionController::Base
 ...
 serialization_scope :current_ability

 def current_ability
   @current_ability ||= Ability.new(current_user)
 end

end


class CommentSerializer < ActiveModel::Serializer
  attributes :id, :content, :created_at, :can_update

  def can_update
    scope.can?(:update, object)
  end

end

我不能这样做,因为我的能力实际上是基于两个变量(不在上面的例子中)。
如果您仍然需要访问current_user,则只需在Ability上设置一个实例变量。