仅为当前用户和特定角色显示序列化程序属性

时间:2015-12-01 09:13:00

标签: ruby-on-rails-4 active-model-serializers

我需要仅为当前经过身份验证的用户输出auth_token属性。

我的用户控制器已

class Api::V1::UsersController < ApplicationController
  before_action :authenticate_with_token!, only: [:show, :create, :update, :destroy]
  respond_to :json

  def show
    authorize User
    respond_with User.find(params[:id])
  end
...

序列化器:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :created_at, :updated_at, :auth_token
  has_one :role

http请求类似于: 获取http://api.domain.com/users/1 使用标题:接受,内容类型和授权 (授权是auth_token)。

返回的是:

{
  "user": {
    "id": 1,
    "email": "user1@domain.com",
    "created_at": "2015-12-01T07:36:55.276Z",
    "updated_at": "2015-12-01T07:36:55.276Z",
    "auth_token": "8xxoZjZyx313cx2poabz",
    "role": {
      "id": 1,
      "name": "admin",
      "created_at": "2015-12-01T07:36:55.190Z",
      "updated_at": "2015-12-01T07:36:55.190Z"
    }
  }
}

我只希望auth_token显示它所属的用户请求它或具有super角色的用户请求它。我的用户模型中有一个方法可以检查has_role? :super

这样的角色

在序列化器中,我尝试了这一点,但实际上只是在黑暗中拍摄。我不知道如何做到这一点:

...
def filter(keys)
  if scope.auth_token == :auth_token
    keys
  else
    keys - [:auth_token]
  end
end

修改

使用active_model_serializer版本0.9.3

1 个答案:

答案 0 :(得分:0)

在源中看到this,点击了我的脑袋。

将上面的filter方法更改为以下内容可以获得所需的结果。

  def filter(keys)
    if (scope == object) or scope.has_role?(:super)
      keys
    else
      keys - [:auth_token]
    end
  end

希望这可以帮助其他人使用0.9.x版本