programing

Active Model을 사용하여 동일한 모델에 여러 개의 다른 시리얼라이저를 구현하는 방법:시리얼라이저?

testmans 2023. 3. 6. 20:51
반응형

Active Model을 사용하여 동일한 모델에 여러 개의 다른 시리얼라이저를 구현하는 방법:시리얼라이저?

Rails에서 REST API를 구현한다고 가정해 보겠습니다.컬렉션을 제공할 때는 몇 가지 속성만 포함할 수 있습니다.

/people

그러나 단일 리소스를 제공할 때는 다음과 같은 모든 속성을 포함해야 합니다.

/people/1

Active Model을 사용하여 이 작업을 수행하는 방법을 알 수 없습니다.시리얼 라이저는, 모두 모델 마다 1개의 시리얼 라이저를 정의하는 패턴을 사용하고 있기 때문에(표준 명명 규칙을 사용하고), 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

뷰에 관한 문제가 모델에 혼재하는 것을 피하기 위해 HTML과 마찬가지로 뷰에서 각 액션의 JSON을 렌더링합니다.

jbuilderrabl 둘 다 이 데이터 템플릿의 요구를 충분히 충족시키고 있습니다.

업데이트 2013-12-16: ActiveModelSerializers 라이브러리는 커스텀시리얼라이저를 사용하여 @phaedryx가 나중에 응답할 수 있도록 한 모델에 대해 여러 개의 시리얼라이저를 정의할 수 있습니다.

@phaedryx가 말한 내용에 덧붙여, 이것을 위해서 제가 하고 있는 것은, 올바른 시리얼라이저를 반환하는 메서드를 호출하는 것입니다.질문에는 다음과 같이 대답하겠습니다.

class MyController < ApplicationController

  def index
    render json: @people, each_serializer: serializer_method
  end

  private

  def serializer_method
    defined?(@people) ? PeopleSerializer : PersonSerializer
  end

end

IMO는 각 컨트롤러 액션에 대해 특정 시리얼라이저를 사용하는 것이 가장 좋습니다.난 이 문제를 해결하기 위해 이 문제를 만들었다.(기본 컨트롤러에 추가)

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:

올바른 시리얼라이저를 검출합니다.

언급URL : https://stackoverflow.com/questions/12485404/how-to-implement-multiple-different-serializers-for-same-model-using-activemodel

반응형