为具有belongs_to关联的模型构建json api时,将忽略该关联的白名单属性

时间:2013-08-08 17:34:29

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

我正在为我的模型UserUser belongs_to :role构建一个json api。即使我已经为Role构建了json api并将我想要包含的属性列入白名单,但每当我访问user#show操作时,都会忽略列入白名单的属性。

在我的RoleSerializer文件中,我指定只能访问两个属性::id:name。当我转到'roles#show'动作时,这样可以正常工作,并且只渲染这两个属性。

/roles/1.json

{"role":{"id":1,"name":"Admin"}}

但是,此json响应不用于user#show json响应。它一直在created_atupdated_at属性,我不想要。

/users/1.json

{ 
  "user": { 
      "id": 1,
      "email": "dietz.72@osu.edu",
      "name_n": "dietz.72", 
      "first_name": "Peter", 
      "last_name": "Dietz",
      "role": {  
          "created_at": "2013-08-08T00:21:56Z",
          "id":1,
          "name": "Admin",
          "updated_at": "2013-08-08T00:21:56Z" } } }

我尝试了多种方式列出:role中的user_serializer.rb属性,包括以下代码。不幸的是,这不起作用。

user_serializer.rb

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :name_n, :first_name, :last_name

  # I also tried attributes :role
  attribute :role, serializer: RoleSerializer
end

users_controller.rb - 显示操作

def show
  @user = User.where(id: params[:id]).first

  respond_to do |format|
    format.html
    format.json { render json: users }
  end
end

user.rb

class User < ActiveRecord::Base
  attr_accessible :email, :emplid, :name_n, :first_name, :last_name

  belongs_to :role
  has_many :agreements, foreign_key: "student_id"
  has_many :forms, through: :agreements, foreign_key: "student_id"

  def active_model_serializer
    UserSerializer
  end
  ...
end

1 个答案:

答案 0 :(得分:0)

从ActiveModelSerializer的github页面的问题队列中取得这位优秀的绅士: https://github.com/rails-api/active_model_serializers/issues/371#issuecomment-22363620

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :name_n, :first_name, :last_name

  has_one :role, serializer: RoleSerializer
end

因此,即使控制器中存在User belongs_to :role关联,使用has_one关联也会使用ActiveModel序列化程序并仅提供我想要的属性。