Rails - Dinamically选择要序列化的属性

时间:2017-06-03 03:34:39

标签: ruby-on-rails ruby ruby-on-rails-4 serialization

我正在使用ActiveModel Serializers来序列化我的模型,并且我一直需要创建一个新的序列化器,以满足控制器的需要,而不会将不必要的信息包含在另一个中。

class ContactGroupSerializer < ActiveModel::Serializer
  attributes :id, :name, :contacts, :contacts_count, 
             :company_id, :user_id

  def contacts_count
    object.contacts.count
  end
end

有没有办法定义单个序列化程序,例如上面的序列化程序,并且它们会以恐怖方式选择要包含在我的控制器响应中的属性?

class ContactsGroupsController < ApplicationController
  def index
    ...
    render json: @contact_groups // here I would like to return only id and name, for example
  end
end

我知道我可以通过创建另一个序列化器来实现这一目标,但我不愿意。

1 个答案:

答案 0 :(得分:1)

好吧,您可以在application_controller.rb中定义一个方法,您可以将所有要呈现的对象传递给要返回的方法数组作为响应。例如,

def response_for(object, methods = [:id])
  if object.blank?
    head :no_content
  elsif object.errors.any?
    render json: { errors: object.errors.messages }, status: 422
  else
    render json: build_hash_for(object, methods), status: 200
  end
end

private #or in your `application_helper.rb`

def build_hash_for(object, methods)
  methods.inject({}) do |hash, method|
    hash.merge!(method => object.send(method))
  end
end

在您上面的特定情况中,您可以

class ContactsGroupsController < ApplicationController

  def index
    ...
    response_for @contact_groups, [:id, :name]
  end
end