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을 렌더링합니다.
jbuilder와 rabl 둘 다 이 데이터 템플릿의 요구를 충분히 충족시키고 있습니다.
업데이트 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
'programing' 카테고리의 다른 글
이벤트 개체에서 데이터 속성에 액세스하는 방법 (0) | 2023.03.11 |
---|---|
페이지 번호 장식을 사용하지 않고 ngTable을 렌더링하려면 어떻게 해야 합니까? (0) | 2023.03.11 |
데이터베이스 구조 변경에 대한 버전 관리 시스템이 있습니까? (0) | 2023.03.06 |
CSS 포인터 이벤트 및 커서 스타일 (0) | 2023.03.06 |
퍼포먼스를 중시하는 $broadcast 또는 $watch란 무엇입니까? (0) | 2023.03.06 |