我正在使用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
我知道我可以通过创建另一个序列化器来实现这一目标,但我不愿意。
答案 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