假设你正在Rails中实现一个REST API。在提供集合时,可能只想包含少量属性:
/people
但是当提供单个资源时,您想要包括所有属性:
/people/1
我不知道如何使用ActiveModel::Serializers实现这一点,因为所有的例子都使用定义一个模型对应一个序列化器的模式(有一个标准的命名约定),并且在控制器中使用AMS自动使用正确的序列化器。
render json: @people
或者:
render json: @person
假设你正在Rails中实现一个REST API。在提供集合时,可能只想包含少量属性:
/people
但是当提供单个资源时,您想要包括所有属性:
/people/1
我不知道如何使用ActiveModel::Serializers实现这一点,因为所有的例子都使用定义一个模型对应一个序列化器的模式(有一个标准的命名约定),并且在控制器中使用AMS自动使用正确的序列化器。
render json: @people
或者:
render json: @person
您可以为同一模型拥有多个序列化器,例如:
class SimplePersonSerializer < ActiveModel::Serializer
attributes :id, :name
end
和
class CompletePersonSerializer < ActiveModel::Serializer
attributes :id, :name, :phone, :email
end
一个控制器中的简单信息:
render json: @people, each_serializer: SimplePersonSerializer
其他地区的人完整信息:
render json: @people, each_serializer: CompletePersonSerializer
一个人的简单信息:
render json: @person, serializer: SimplePersonSerializer
一个单个人的完整信息:
render json: @person, serializer: CompletePersonSerializer
class CompletePersonSerializer < ActiveModel::Serializer
root :person
attributes :id, :name, :phone, :email
end
或者render json: @people, each_serializer: CompletePersonSerializer, root: :person
root:person
报错。each_serializer: CompletePersonSerializer
足够。 - nerfologist接着 @phaedryx 的说法,我为此调用一个返回正确序列化程序的方法...对于你的问题,我会使用:
class MyController < ApplicationController
def index
render json: @people, each_serializer: serializer_method
end
private
def serializer_method
defined?(@people) ? PeopleSerializer : PersonSerializer
end
end
我认为最好为每个控制器操作都有一个特定的序列化程序。我构建了这个关注点来处理它。(我将其添加到基本控制器中)
module Serializable
extend ActiveSupport::Concern
alias each_serializer serializer
def serializer
"#{params[:controller].classify}s::#{params[:action].classify}Serializer".constantize
end
end
这样你就可以直接调用了
render json: @person, serializer:
在您的控制器中,它将会找到正确的序列化器。
root: :person
。以下是完整的示例:render json: @person, serializer: CompletePersonSerializer, root: :person
。 - Seif SallamSimplePersonSerializer
类来创建一个子类CompletePersonSerializer
,并添加您需要的新属性。 - Mark Swardstromroot: person
。这样你在调用render json
的时候就不需要到处指定它了。 - Ranhiru Jude Cooray